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;
163 static int output_css
=0;
165 static struct option long_options
[]=
167 {"convert",no_argument
,&convert
,1},
168 {"css",no_argument
,&output_css
,1},
169 {"split",no_argument
,&split
,1},
174 setlocale(LC_TIME
,"");
177 #if defined(ENABLE_NLS) && defined(HAVE_LOCALE_H)
178 if (!setlocale (LC_ALL
, "")) {
179 fprintf(stderr
,"SARG: Cannot set the locale LC_ALL to the environment variable\n");
182 if (!bindtextdomain (PACKAGE_NAME
, LOCALEDIR
)) {
183 fprintf(stderr
,"SARG: Cannot bind to text domain %s in directory %s (%s)\n",PACKAGE_NAME
,LOCALEDIR
,strerror(errno
));
186 if (!textdomain (PACKAGE_NAME
)) {
187 fprintf(stderr
,"SARG: Cannot set gettext domain for %s PACKAGE_NAME (%s)\n",PACKAGE_NAME
,strerror(errno
));
197 UserAgentLog
[0]='\0';
198 ExcludeHosts
[0]='\0';
199 ExcludeUsers
[0]='\0';
206 ExternalCSSFile
[0]='\0';
207 RedirectorLogFormat
[0]='\0';
209 for (ilf
=0 ; ilf
<ILF_Last
; ilf
++) ilf_count
[ilf
]=0;
211 sprintf(ExcludeCodes
,"%s/exclude_codes",SYSCONFDIR
);
212 strcpy(GraphDaysBytesBarColor
,"orange");
213 strcpy(BgColor
,"#ffffff");
214 strcpy(TxColor
,"#000000");
215 strcpy(TxBgColor
,"lavender");
216 strcpy(TiColor
,"darkblue");
219 strcpy(LogoTextColor
,"#000000");
220 strcpy(HeaderColor
,"darkblue");
221 strcpy(HeaderBgColor
,"#dddddd");
222 strcpy(LogoTextColor
,"#006699");
223 strcpy(FontSize
,"9px");
224 strcpy(TempDir
,"/tmp");
225 strcpy(OutputDir
,"/var/www/html/squid-reports");
227 strcpy(DateFormat
,"u");
228 OverwriteReport
=false;
229 RemoveTempFiles
=true;
230 strcpy(ReplaceIndex
,"index.html");
232 RecordsWithoutUser
=RECORDWITHOUTUSER_IP
;
234 strcpy(MailUtility
,"mailx");
238 strcpy(TopuserSortField
,"BYTES");
239 strcpy(UserSortField
,"BYTES");
240 strcpy(TopuserSortOrder
,"reverse");
241 strcpy(UserSortOrder
,"reverse");
242 strcpy(TopsitesSortField
,"CONNECT");
243 strcpy(TopsitesSortType
,"D");
245 strcpy(FontFace
,"Verdana,Tahoma,Arial");
246 datetimeby
=DATETIME_BYTE
;
247 strcpy(CharSet
,"ISO-8859-1");
249 strcpy(PrivacyString
,"***.***.***.***");
250 strcpy(PrivacyStringColor
,"blue");
252 TopUserFields
=TOPUSERFIELDS_NUM
| TOPUSERFIELDS_DATE_TIME
| TOPUSERFIELDS_USERID
| TOPUSERFIELDS_CONNECT
|
253 TOPUSERFIELDS_BYTES
| TOPUSERFIELDS_SETYB
| TOPUSERFIELDS_IN_CACHE_OUT
|
254 TOPUSERFIELDS_USED_TIME
| TOPUSERFIELDS_MILISEC
| TOPUSERFIELDS_PTIME
|
255 TOPUSERFIELDS_TOTAL
| TOPUSERFIELDS_AVERAGE
;
256 UserReportFields
=USERREPORTFIELDS_CONNECT
| USERREPORTFIELDS_BYTES
| USERREPORTFIELDS_SETYB
|
257 USERREPORTFIELDS_IN_CACHE_OUT
| USERREPORTFIELDS_USED_TIME
| USERREPORTFIELDS_MILISEC
|
258 USERREPORTFIELDS_PTIME
| USERREPORTFIELDS_TOTAL
| USERREPORTFIELDS_AVERAGE
;
259 strcpy(DataFileDelimiter
,";");
260 DataFileFields
=DATA_FIELD_USER
| DATA_FIELD_DATE
| DATA_FIELD_TIME
| DATA_FIELD_URL
| DATA_FIELD_CONNECT
|
261 DATA_FIELD_BYTES
| DATA_FIELD_IN_CACHE
| DATA_FIELD_OUT_CACHE
| DATA_FIELD_ELAPSED
;
262 ShowReadStatistics
=true;
263 strcpy(IndexSortOrder
,"D");
266 strcpy(ParsedOutputLog
,"no");
267 strcpy(ParsedOutputLogCompress
,"/bin/gzip -f");
268 DisplayedValues
=DISPLAY_ABBREV
;
269 strcpy(HeaderFontSize
,"9px");
270 strcpy(TitleFontSize
,"11px");
271 strcpy(AuthUserTemplateFile
,"sarg_htaccess");
272 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");
275 strcpy(GraphFont
,FONTDIR
"/DejaVuSans.ttf");
279 strcpy(Ulimit
,"20000");
280 NtlmUserFormat
=NTLMUSERFORMAT_DOMAINUSER
;
281 IndexTree
=INDEX_TREE_FILE
;
282 strcpy(RealtimeTypes
,"GET,PUT,CONNECT");
283 RealtimeUnauthRec
=REALTIME_UNAUTH_REC_SHOW
;
284 RedirectorIgnoreDate
=false;
285 DansguardianIgnoreDate
=false;
286 DataFileUrl
=DATAFILEURL_IP
;
287 strcpy(MaxElapsed
,"28800000");
288 BytesInSitesUsersReport
=0;
289 UserAuthentication
=0;
290 strcpy(LDAPHost
,"127.0.0.1");
292 LDAPProtocolVersion
=3;
295 LDAPBaseSearch
[0]='\0';
296 strcpy(LDAPFilterSearch
, "uid=%s");
297 strcpy(LDAPTargetAttr
, "cn");
321 UserInvalidChar
[0]='\0';
323 SquidGuardConf
[0]='\0';
324 DansGuardianConf
[0]='\0';
331 dansguardian_count
=0;
334 DeniedReportLimit
=10;
335 AuthfailReportLimit
=10;
336 DansGuardianReportLimit
=10;
337 SquidGuardReportLimit
=10;
338 DownloadReportLimit
=50;
347 realtime_access_log_lines
=1000;
355 bzero(IncludeUsers
, sizeof(IncludeUsers
));
356 bzero(ExcludeString
, sizeof(ExcludeString
));
357 first_user_file
=NULL
;
358 memset(&period
,0,sizeof(period
));
361 for(x
=0; x
<MAXLOGS
; x
++)
362 AccessLog
[x
][0]='\0';
363 AccessLogFromCmdLine
=0;
364 RedirectorLogFromCmdLine
=0;
366 strcpy(Title
,_("Squid User Access Report"));
368 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){
377 strcpy(uagent
,optarg
);
380 strcpy(hexclude
,optarg
);
383 strncpy(date
,optarg
,sizeof(date
)-1);
384 date
[sizeof(date
)-1]='\0';
385 date_from(date
, &dfrom
, &duntil
);
388 strcpy(email
,optarg
);
391 strcpy(ConfigFile
,optarg
);
403 if (NAccessLog
>=MAXLOGS
) {
404 debuga(_("Too many log files passed on command line with option -l.\n"));
407 if (strlen(optarg
)>=MAX_LOG_FILELEN
) {
408 debuga(_("Log file name too long passed on command line with option -l: %s\n"),optarg
);
411 strcpy(AccessLog
[NAccessLog
],optarg
);
413 AccessLogFromCmdLine
++;
416 if (NRedirectorLogs
>MAX_REDIRECTOR_LOGS
) {
417 debuga(_("Too many redirector logs passed on command line with option -L.\n"));
420 if (strlen(optarg
)>=MAX_REDIRECTOR_FILELEN
) {
421 debuga(_("Redirector log file name too long passed on command line with opton -L: %s\n"),optarg
);
424 strcpy(RedirectorLogs
[NRedirectorLogs
],optarg
);
426 RedirectorLogFromCmdLine
++;
435 strcpy(outdir
,optarg
);
450 if(strstr(optarg
,"-") == 0) {
454 getword_start(&gwarea
,optarg
);
455 if (getword(hm
,sizeof(hm
),&gwarea
,'-')<0 || getword(hmf
,sizeof(hmf
),&gwarea
,'\0')<0) {
456 debuga(_("The time range passed on the command line with option -t is invalid\n"));
460 if(sscanf(hm
,"%d:%d",&h
,&m
)!=2) {
461 debuga(_("Time period must be MM or MM:SS. Exit\n"));
464 sprintf(hm
,"%02d%02d",h
,m
);
465 if(sscanf(hmf
,"%d:%d",&h
,&m
)!=2) {
466 debuga(_("Time period must be MM or MM:SS. Exit\n"));
469 sprintf(hmf
,"%02d%02d",h
,m
);
491 debuga(_("Option -%c require an argument\n"),optopt);
507 if(debug
) debuga(_("Init\n"));
509 if(ConfigFile
[0] == '\0') snprintf(ConfigFile
,sizeof(ConfigFile
),"%s/sarg.conf",SYSCONFDIR
);
510 if(access(ConfigFile
, R_OK
) != 0) {
511 debuga(_("Cannot open config file: %s - %s\n"),ConfigFile
,strerror(errno
));
515 if(access(ConfigFile
, R_OK
) == 0)
518 if(userip
) UserIp
=true;
520 if(dns
) Ip2Name
=true;
527 if(IndexTree
== INDEX_TREE_FILE
)
528 strcpy(ImageFile
,"../images");
530 strcpy(ImageFile
,"../../../images");
533 if(DataFile
[0] != '\0')
536 if(NAccessLog
== 0) {
537 strcpy(AccessLog
[0],"/var/log/squid/access.log");
546 splitlog(AccessLog
[0], df
, dfrom
, duntil
, convert
);
550 convlog(AccessLog
[0], df
, dfrom
, duntil
);
554 load_excludecodes(ExcludeCodes
);
556 if(access(PasswdFile
, R_OK
) == 0) {
557 getusers(PasswdFile
,debug
);
561 if(hexclude
[0] == '\0')
562 strcpy(hexclude
,ExcludeHosts
);
563 if(hexclude
[0] != '\0') {
564 gethexclude(hexclude
,debug
);
568 if(ReportType
== 0) {
569 ReportType
=REPORT_TYPE_TOPUSERS
| REPORT_TYPE_TOPSITES
| REPORT_TYPE_USERS_SITES
|
570 REPORT_TYPE_SITES_USERS
| REPORT_TYPE_DATE_TIME
| REPORT_TYPE_DENIED
|
571 REPORT_TYPE_AUTH_FAILURES
| REPORT_TYPE_SITE_USER_TIME_DATE
| REPORT_TYPE_DOWNLOADS
;
574 if(access(ExcludeUsers
, R_OK
) == 0) {
575 getuexclude(ExcludeUsers
,debug
);
584 if(strcmp(ExcludeUsers
,"indexonly") == 0) indexonly
++;
585 if(Index
== INDEX_ONLY
) indexonly
++;
587 if(MaxElapsed
[0] != '\0') max_elapsed
=atol(MaxElapsed
);
589 if(outdir
[0] == '\0') strcpy(outdir
,OutputDir
);
592 if(uagent
[0] == '\0') strcpy(uagent
,UserAgentLog
);
594 if(tmp
[0] == '\0') strcpy(tmp
,TempDir
);
595 else strcpy(TempDir
,tmp
);
597 if(df
[0] == '\0') strcpy(df
,DateFormat
);
598 else strcpy(DateFormat
,df
);
602 strcpy(DateFormat
,"u");
605 IndexTree
=INDEX_TREE_FILE
;
607 if(email
[0] == '\0' && OutputEmail
[0] != '\0') strcpy(email
,OutputEmail
);
611 if(email
[0] != '\0') {
612 snprintf(wtemp2
,sizeof(wtemp2
),"%s/sarg",tmp2
);
614 strcat(tmp2
,"/sarg");
619 strcat(tmp2
,"/sarg.log");
621 sprintf(tmp3
,"%s/sarg",tmp
);
622 if(access(tmp3
, R_OK
) == 0) {
626 strcpy(denied_unsort
,tmp3
);
627 strcpy(denied_sort
,tmp3
);
628 strcpy(authfail_unsort
,tmp3
);
629 strcat(denied_unsort
,"/denied.log.unsort");
630 strcat(denied_sort
,"/denied.log");
631 strcat(authfail_unsort
,"/authfail.log.unsort");
634 debuga(_("Parameters:\n"));
635 debuga(_(" Hostname or IP address (-a) = %s\n"),addr
);
636 debuga(_(" Useragent log (-b) = %s\n"),uagent
);
637 debuga(_(" Exclude file (-c) = %s\n"),hexclude
);
638 debuga(_(" Date from-until (-d) = %s\n"),date
);
639 debuga(_(" Email address to send reports (-e) = %s\n"),email
);
640 debuga(_(" Config file (-f) = %s\n"),ConfigFile
);
641 if(strcmp(df
,"e") == 0)
642 debuga(_(" Date format (-g) = Europe (dd/mm/yyyy)\n"));
643 if(strcmp(df
,"u") == 0)
644 debuga(_(" Date format (-g) = USA (mm/dd/yyyy)\n"));
645 if(strcmp(df
,"w") == 0)
646 debuga(_(" Date format (-g) = Sites & Users (yyyy/ww)\n"));
647 debuga(_(" IP report (-i) = %s\n"),(iprel
) ? _("Yes") : _("No"));
648 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++)
649 debuga(_(" Input log (-l) = %s\n"),AccessLog
[iarq
]);
650 for (iarq
=0 ; iarq
<NRedirectorLogs
; iarq
++)
651 debuga(_(" Redirector log (-L) = %s\n"),RedirectorLogs
[iarq
]);
652 debuga(_(" Resolve IP Address (-n) = %s\n"),(Ip2Name
) ? _("Yes") : _("No"));
653 debuga(_(" Output dir (-o) = %s\n"),outdir
);
654 debuga(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp
) ? _("Yes") : _("No"));
655 debuga(_(" Accessed site (-s) = %s\n"),site
);
656 debuga(_(" Time (-t) = %s\n"),hm
);
657 debuga(_(" User (-u) = %s\n"),us
);
658 debuga(_(" Temporary dir (-w) = %s\n"),tmp
);
659 debuga(_(" Debug messages (-x) = %s\n"),(debug
) ? _("Yes") : _("No"));
660 debuga(_(" Process messages (-z) = %s\n"),(debugz
) ? _("Yes") : _("No"));
665 printf(_("Parameters:\n"));
666 printf(_(" Hostname or IP address (-a) = %s\n"),addr
);
667 printf(_(" Useragent log (-b) = %s\n"),uagent
);
668 printf(_(" Exclude file (-c) = %s\n"),hexclude
);
669 printf(_(" Date from-until (-d) = %s\n"),date
);
670 printf(_(" Email address to send reports (-e) = %s\n"),email
);
671 printf(_(" Config file (-f) = %s\n"),ConfigFile
);
672 if(strcmp(df
,"e") == 0)
673 printf(_(" Date format (-g) = Europe (dd/mm/yyyy)\n"));
674 if(strcmp(df
,"u") == 0)
675 printf(_(" Date format (-g) = USA (mm/dd/yyyy)\n"));
676 if(strcmp(df
,"w") == 0)
677 printf(_(" Date format (-g) = Sites & Users (yyyy/ww)\n"));
678 printf(_(" IP report (-i) = %s\n"),(iprel
) ? _("Yes") : _("No"));
679 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++)
680 printf(_(" Input log (-l) = %s\n"),AccessLog
[iarq
]);
681 for (iarq
=0 ; iarq
<NRedirectorLogs
; iarq
++)
682 printf(_(" Redirector log (-L) = %s\n"),RedirectorLogs
[iarq
]);
683 printf(_(" Resolve IP Address (-n) = %s\n"),(Ip2Name
) ? _("Yes") : _("No"));
684 printf(_(" Output dir (-o) = %s\n"),outdir
);
685 printf(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp
) ? _("Yes") : _("No"));
686 printf(_(" Accessed site (-s) = %s\n"),site
);
687 printf(_(" Time (-t) = %s\n"),hm
);
688 printf(_(" User (-u) = %s\n"),us
);
689 printf(_(" Temporary dir (-w) = %s\n"),tmp
);
690 printf(_(" Debug messages (-x) = %s\n"),(debug
) ? _("Yes") : _("No"));
691 printf(_(" Process messages (-z) = %s\n"),(debugz
) ? _("Yes") : _("No"));
692 printf(_("sarg version: %s\n"),VERSION
);
696 debuga(_("sarg version: %s\n"),VERSION
);
698 maxopenfiles
=MAX_OPEN_USER_FILES
;
700 if (Ulimit
[0] != '\0') {
705 #if defined(RLIMIT_NOFILE)
706 getrlimit (RLIMIT_NOFILE
, &rl
);
707 #elif defined(RLIMIT_OFILE)
708 getrlimit (RLIMIT_OFILE
, &rl
);
710 #warning "No rlimit resource for the number of open files"
715 rl
.rlim_cur
= atol(Ulimit
);
716 rl
.rlim_max
= atol(Ulimit
);
717 #if defined(RLIMIT_NOFILE)
718 rc
=setrlimit (RLIMIT_NOFILE
, &rl
);
719 #elif defined(RLIMIT_OFILE)
720 rc
=setrlimit (RLIMIT_OFILE
, &rl
);
722 #warning "No rlimit resource for the number of open files"
725 debuga(_("setrlimit error - %s\n"),strerror(errno
));
729 debuga("Maximum file descriptor: cur=%ld max=%ld, changed to cur="RLIM_STRING
" max="RLIM_STRING
,l1
,l2
,rl
.rlim_cur
,rl
.rlim_max
);
733 init_usertab(UserTabFile
);
735 if ((line
=longline_create())==NULL
) {
736 debuga(_("Not enough memory to read a log file\n"));
740 snprintf(sz_Download_Unsort
,sizeof(sz_Download_Unsort
),"%s/sarg/download.unsort", tmp
);
742 if(DataFile
[0]=='\0') {
743 if((ReportType
& REPORT_TYPE_DENIED
) != 0) {
744 if((fp_denied
=MY_FOPEN(denied_unsort
,"w"))==NULL
) {
745 debuga(_("(log) Cannot open file: %s - %s\n"),denied_unsort
,strerror(errno
));
750 if((ReportType
& REPORT_TYPE_DENIED
) != 0 || (ReportType
& REPORT_TYPE_AUTH_FAILURES
) != 0) {
751 if((fp_authfail
=MY_FOPEN(authfail_unsort
,"w"))==NULL
) {
752 debuga(_("(log) Cannot open file: %s - %s\n"),authfail_unsort
,strerror(errno
));
758 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++) {
759 strcpy(arq
,AccessLog
[iarq
]);
763 if(strcmp(arq
,"-")==0) {
765 debuga(_("Reading access log file: from stdin\n"));
770 if (stat(arq
,&logstat
)!=0) {
771 debuga(_("Cannot get the modification time of input log file %s (%s). Processing it anyway\n"),arq
,strerror(errno
));
773 struct tm
*logtime
=localtime(&logstat
.st_mtime
);
774 if ((logtime
->tm_year
+1900)*10000+(logtime
->tm_mon
+1)*100+logtime
->tm_mday
<dfrom
) {
775 debuga(_("Ignoring old log file %s\n"),arq
);
780 fp_in
=decomp(arq
,&from_pipe
);
782 debuga(_("(log) Cannot open log file: %s - %s\n"),arq
,strerror(errno
));
785 if(debug
) debuga(_("Reading access log file: %s\n"),arq
);
790 // pre-read the file only if we have to show stats
791 if(ShowReadStatistics
&& !from_stdin
&& !from_pipe
) {
799 while ((nread
=fread(tmp4
,1,sizeof(tmp4
),fp_in
))>0) {
800 for (i
=0 ; i
<nread
; i
++)
802 if (tmp4
[i
]!='\n' && tmp4
[i
]!='\r') {
806 if (tmp4
[i
]=='\n' || tmp4
[i
]=='\r') {
813 printf(_("SARG: Records in file: %lu, reading: %3.2f%%"),recs1
,(float) 0);
818 longline_reset(line
);
820 while ((linebuf
=longline_read(fp_in
,line
))!=NULL
) {
821 blen
=strlen(linebuf
);
823 if (ilf
==ILF_Unknown
) {
824 if(strncmp(linebuf
,"#Software: Mic",14) == 0) {
825 fixendofline(linebuf
);
827 debuga(_("Log is from Microsoft ISA: %s\n"),linebuf
);
833 if(strncmp(linebuf
,"*** SARG Log ***",16) == 0) {
834 if (getperiod_fromsarglog(arqtt
,&period
)<0) {
835 debuga(_("The name of the file is invalid: %s\n"),arq
);
844 if(!fp_log
&& strcmp(ParsedOutputLog
, "no") != 0 && ilf
!=ILF_Sarg
) {
845 if(access(ParsedOutputLog
,R_OK
) != 0) {
846 my_mkdir(ParsedOutputLog
);
848 sprintf(arq_log
,"%s/sarg_temp.log",ParsedOutputLog
);
849 if((fp_log
=MY_FOPEN(arq_log
,"w"))==NULL
) {
850 debuga(_("(log) Cannot open log file: %s - %s\n"),arq_log
,strerror(errno
));
853 fputs("*** SARG Log ***\n",fp_log
);
857 if( ShowReadStatistics
&& !from_stdin
&& --OutputNonZero
<=0) {
858 double perc
= recs2
* 100. / recs1
;
859 printf(_("SARG: Records in file: %lu, reading: %3.2lf%%"),recs1
,perc
);
862 OutputNonZero
= REPORT_EVERY_X_LINES
;
864 if(blen
< 58) continue;
865 if(strstr(linebuf
,"HTTP/0.0") != 0) continue;
866 if(strstr(linebuf
,"logfile turned over") != 0) continue;
867 if(linebuf
[0] == ' ') continue;
870 if(ExcludeString
[0] != '\0') {
872 getword_start(&gwarea
,ExcludeString
);
873 while(strchr(gwarea
.current
,':') != 0) {
874 if (getword_multisep(val1
,sizeof(val1
),&gwarea
,':')<0) {
875 debuga(_("Maybe you have a broken record or garbage in your exclusion string\n"));
878 if((str
=(char *) strstr(linebuf
,val1
)) != (char *) NULL
) {
883 if(!exstring
&& (str
=(char *) strstr(linebuf
,gwarea
.current
)) != (char *) NULL
)
885 if(exstring
) continue;
890 printf("BUF=%s\n",linebuf
);
893 if (ilf
==ILF_Squid
|| ilf
==ILF_Common
|| ilf
==ILF_Unknown
) {
894 getword_start(&gwarea
,linebuf
);
895 if (getword(data
,sizeof(data
),&gwarea
,' ')<0) {
896 debuga(_("Maybe you have a broken time in your access.log file\n"));
899 if((str
=(char *) strchr(data
, '.')) != (char *) NULL
&& (str
=(char *) strchr(str
+1, '.')) != (char *) NULL
) {
903 if (getword(user
,sizeof(user
),&gwarea
,' ')<0 || getword_skip(255,&gwarea
,' ')<0) {
904 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
908 if (getword_skip(255,&gwarea
,' ')<0 || getword(user
,sizeof(user
),&gwarea
,' ')<0) {
909 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
913 if (getword(data
,sizeof(data
),&gwarea
,']')<0 || getword_skip(MAXLEN
,&gwarea
,'"')<0 ||
914 getword(fun
,sizeof(fun
),&gwarea
,' ')<0) {
915 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
918 if (getword_ptr(linebuf
,&url
,&gwarea
,' ')<0) {
919 debuga(_("Maybe you have a broken url in your %s file\n"),arq
);
922 if (getword_skip(MAXLEN
,&gwarea
,' ')<0) {
923 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
926 if (getword(code2
,sizeof(code2
),&gwarea
,' ')<0) {
927 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
930 if (getword(tam
,sizeof(tam
),&gwarea
,' ')<0) {
931 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
934 if((str
=(char *) strchr(gwarea
.current
, ' ')) != (char *) NULL
) {
935 if (getword(code
,sizeof(code
),&gwarea
,' ')<0) {
936 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
940 if (getword(code
,sizeof(code
),&gwarea
,'\0')<0) {
941 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
946 if ((str
= strchr(code
, ':')) != NULL
)
949 if(strcmp(tam
,"\0") == 0)
955 getword_start(&gwarea
,data
+1);
956 if (getword_multisep(data
,sizeof(data
),&gwarea
,':')<0){
957 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
960 if (getword_multisep(hora
,sizeof(hora
),&gwarea
,' ')<0){
961 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
964 getword_start(&gwarea
,data
);
965 if (getword_atoll(&iday
,&gwarea
,'/')<0){
966 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
969 if (getword(mes
,sizeof(mes
),&gwarea
,'/')<0){
970 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
973 if (getword_atoll(&iyear
,&gwarea
,'/')<0){
974 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
978 imonth
=month2num(mes
)+1;
979 idata
=builddia(iday
,imonth
,iyear
);
980 computedate(iyear
,imonth
,iday
,&tt
);
984 if(ilf
==ILF_Unknown
|| ilf
==ILF_Squid
) {
985 if (getword(elap
,sizeof(elap
),&gwarea
,' ')<0) {
986 debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq
);
989 while(strcmp(elap
,"") == 0 && gwarea
.current
[0] != '\0')
990 if (getword(elap
,sizeof(elap
),&gwarea
,' ')<0) {
991 debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq
);
994 if(strlen(elap
) < 1) continue;
995 if (getword(ip
,sizeof(ip
),&gwarea
,' ')<0){
996 debuga(_("Maybe you have a broken client IP address in your %s file\n"),arq
);
999 if (getword(code
,sizeof(code
),&gwarea
,' ')<0){
1000 debuga(_("Maybe you have a broken result code in your %s file\n"),arq
);
1003 if (getword(tam
,sizeof(tam
),&gwarea
,' ')<0){
1004 debuga(_("Maybe you have a broken amount of data in your %s file\n"),arq
);
1007 if (getword(fun
,sizeof(fun
),&gwarea
,' ')<0){
1008 debuga(_("Maybe you have a broken request method in your %s file\n"),arq
);
1011 if (getword_ptr(linebuf
,&url
,&gwarea
,' ')<0){
1012 debuga(_("Maybe you have a broken url in your %s file\n"),arq
);
1015 if (getword(user
,sizeof(user
),&gwarea
,' ')<0){
1016 debuga(_("Maybe you have a broken user ID in your %s file\n"),arq
);
1025 debuga(_("Cannot convert the timestamp from the squid log file\n"));
1029 strftime(tbuf2
, sizeof(tbuf2
), "%H%M", t
);
1031 idata
=(t
->tm_year
+1900)*10000+(t
->tm_mon
+1)*100+t
->tm_mday
;
1034 if (ilf
==ILF_Sarg
) {
1035 getword_start(&gwarea
,linebuf
);
1036 if (getword(data
,sizeof(data
),&gwarea
,'\t')<0){
1037 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1040 if (getword(hora
,sizeof(hora
),&gwarea
,'\t')<0) {
1041 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1044 if (getword(user
,sizeof(user
),&gwarea
,'\t')<0) {
1045 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1048 if (getword(ip
,sizeof(ip
),&gwarea
,'\t')<0) {
1049 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1052 if (getword_ptr(linebuf
,&url
,&gwarea
,'\t')<0){
1053 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1056 if (getword(tam
,sizeof(tam
),&gwarea
,'\t')<0){
1057 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1060 if (getword(code
,sizeof(code
),&gwarea
,'\t')<0){
1061 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1064 if (getword(elap
,sizeof(elap
),&gwarea
,'\t')<0){
1065 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1068 if (getword(smartfilter
,sizeof(smartfilter
),&gwarea
,'\0')<0){
1069 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1072 getword_start(&gwarea
,data
);
1073 if (getword_atoll(&iday
,&gwarea
,'/')<0 || iday
<1 || iday
>31){
1074 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1077 if (getword_atoll(&imonth
,&gwarea
,'/')<0 || imonth
<1 || imonth
>12){
1078 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1081 if (getword_atoll(&iyear
,&gwarea
,'\0')<0){
1082 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1085 idata
=builddia(iday
,imonth
,iyear
);
1086 computedate(iyear
,imonth
,iday
,&tt
);
1090 if (linebuf
[0] == '#') {
1091 int ncols
,cols
[ISACOL_Last
];
1093 fixendofline(linebuf
);
1094 getword_start(&gwarea
,linebuf
);
1095 // remove the #Fields: column at the beginning of the line
1096 if (getword_skip(1000,&gwarea
,' ')<0){
1097 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1100 for (ncols
=0 ; ncols
<ISACOL_Last
; ncols
++) cols
[ncols
]=-1;
1102 while(gwarea
.current
[0] != '\0') {
1103 if (getword(val1
,sizeof(val1
),&gwarea
,'\t')<0){
1104 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1107 if(strcmp(val1
,"c-ip") == 0) cols
[ISACOL_Ip
]=ncols
;
1108 if(strcmp(val1
,"cs-username") == 0) cols
[ISACOL_UserName
]=ncols
;
1109 if(strcmp(val1
,"date") == 0) cols
[ISACOL_Date
]=ncols
;
1110 if(strcmp(val1
,"time") == 0) cols
[ISACOL_Time
]=ncols
;
1111 if(strcmp(val1
,"time-taken") == 0) cols
[ISACOL_TimeTaken
]=ncols
;
1112 if(strcmp(val1
,"sc-bytes") == 0) cols
[ISACOL_Bytes
]=ncols
;
1113 if(strcmp(val1
,"cs-uri") == 0) cols
[ISACOL_Uri
]=ncols
;
1114 if(strcmp(val1
,"sc-status") == 0) cols
[ISACOL_Status
]=ncols
;
1117 if (cols
[ISACOL_Ip
]>=0) {
1119 for (ncols
=0 ; ncols
<ISACOL_Last
; ncols
++)
1120 isa_cols
[ncols
]=cols
[ncols
];
1124 if (!isa_ncols
) continue;
1125 getword_start(&gwarea
,linebuf
);
1126 for (x
=0 ; x
<isa_ncols
; x
++) {
1127 if (getword_ptr(linebuf
,&str
,&gwarea
,'\t')<0) {
1128 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1131 if (x
==isa_cols
[ISACOL_Ip
]) {
1132 if (strlen(str
)>=sizeof(ip
)) {
1133 debuga(_("Maybe you have a broken IP in your %s file\n"),arq
);
1137 } else if (x
==isa_cols
[ISACOL_UserName
]) {
1138 if (strlen(str
)>=sizeof(user
)) {
1139 debuga(_("Maybe you have a broken user ID in your %s file\n"),arq
);
1143 } else if (x
==isa_cols
[ISACOL_Date
]) {
1144 if (strlen(str
)>=sizeof(data
)) {
1145 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1149 } else if (x
==isa_cols
[ISACOL_Time
]) {
1150 if (strlen(str
)>=sizeof(hora
)) {
1151 debuga(_("Maybe you have a broken time in your %s file\n"),arq
);
1155 } else if (x
==isa_cols
[ISACOL_TimeTaken
]) {
1156 if (strlen(str
)>=sizeof(elap
)) {
1157 debuga(_("Maybe you have a broken download duration in your %s file\n"),arq
);
1161 } else if (x
==isa_cols
[ISACOL_Bytes
]) {
1162 if (strlen(str
)>=sizeof(tam
)) {
1163 debuga(_("Maybe you have a broken download size in your %s file\n"),arq
);
1167 } else if (x
==isa_cols
[ISACOL_Uri
]) {
1169 } else if (x
==isa_cols
[ISACOL_Status
]) {
1170 if (strlen(str
)>=sizeof(code
)) {
1171 debuga(_("Maybe you have a broken access code in your %s file\n"),arq
);
1178 if(strcmp(code
,"401") == 0 || strcmp(code
,"403") == 0 || strcmp(code
,"407") == 0) {
1179 sprintf(val1
,"DENIED/%s",code
);
1182 getword_start(&gwarea
,data
);
1183 if (getword_atoll(&iyear
,&gwarea
,'-')<0){
1184 debuga(_("Maybe you have a broken year in your %s file\n"),arq
);
1187 if (getword_atoll(&imonth
,&gwarea
,'-')<0){
1188 debuga(_("Maybe you have a broken month in your %s file\n"),arq
);
1191 if (getword_atoll(&iday
,&gwarea
,'\0')<0){
1192 debuga(_("Maybe you have a broken day in your %s file\n"),arq
);
1196 idata
=builddia(iday
,imonth
,iyear
);
1197 computedate(iyear
,imonth
,iday
,&tt
);
1201 debuga(_("Unknown input log file format\n"));
1205 strftime(dia
, sizeof(dia
), "%d/%m/%Y", t
);
1206 snprintf(hora
,sizeof(hora
),"%02d:%02d:%02d",t
->tm_hour
,t
->tm_min
,t
->tm_sec
);
1209 printf("DATE=%s IDATA=%d DFROM=%d DUNTIL=%d\n",date
,idata
,dfrom
,duntil
);
1211 if(date
[0] != '\0'){
1212 if(idata
< dfrom
|| idata
> duntil
) continue;
1215 // Record only hours usage which is required
1217 if( bsearch( &( t
-> tm_wday
), weekdays
.list
, weekdays
.len
,
1218 sizeof( int ), compar
) == NULL
)
1221 if( bsearch( &( t
-> tm_hour
), hours
.list
, hours
.len
,
1222 sizeof( int ), compar
) == NULL
)
1227 if(strlen(user
) > MAX_USER_LEN
) {
1228 if (debugm
) printf(_("User ID too long: %s\n"),user
);
1234 if(IncludeUsers
[0] != '\0') {
1235 sprintf(val1
,":%s:",user
);
1236 if((str
=(char *) strstr(IncludeUsers
,val1
)) == (char *) NULL
)
1241 if (debugm
) printf(_("Excluded code: %s\n"),code
);
1246 if(testvaliduserchar(user
))
1250 if((str
= strstr(user
,"%20")) != NULL
) {
1252 This is a patch introduced to solve bug #1624251 reported at sourceforge but
1253 the side effect is to truncate the name at the first space and merge the reports
1254 of people whose name is identical up to the first space.
1256 The old code used to truncate the user name at the first % if a %20 was
1257 found anywhere in the string. That means the string could be truncated
1258 at the wrong place if another % occured before the %20. This new code should
1259 avoid that problem and only truncate at the space. There is no bug
1260 report indicating that anybody noticed this.
1266 Code prior to 2.2.7 used to replace any %xx by a dot as long as a %5c was
1267 found in the user name.
1269 while((str
= strstr(user
,"%5c")) != NULL
) {
1271 for (x
=3 ; str
[x
] ; x
++) str
[x
-2]=str
[x
];
1279 The full URL is not saved in sarg log. There is no point in testing the URL to detect
1282 download_flag
=is_download_suffix(url
);
1283 if (download_flag
) {
1288 download_flag
=false;
1290 // remove any protocol:// at the beginning of the URL
1291 if ((str
= strchr(url
,'/')) != NULL
&& str
[1] == '/') {
1295 for (i
=0 ; str
[i
] ; i
++)
1301 url_hostname(url
,hostname
,sizeof(hostname
));
1305 if(url
[0] == '\0') continue;
1307 if(addr
[0] != '\0'){
1308 if(strcmp(addr
,ip
)!=0) continue;
1311 if(!vhexclude(url
)) {
1312 if (debugm
) printf(_("Excluded site: %s\n"),url
);
1321 getword_start(&gwarea
,hora
);
1323 if (getword_multisep(warea
,sizeof(warea
),&gwarea
,':')<0){
1324 debuga(_("Maybe you have a broken time in your %s file\n"),arq
);
1327 strncat(hmr
,warea
,2);
1330 strncat(hmr
,gwarea
.current
,2);
1332 if(atoi(hmr
) < atoi(hm
) || atoi(hmr
) > atoi(hmf
)) continue;
1335 if(site
[0] != '\0'){
1336 if(strstr(url
,site
)==0) continue;
1344 if(strcmp(user
,"-") == 0 || strcmp(user
," ") == 0 || strcmp(user
,"") == 0) {
1345 if(RecordsWithoutUser
== RECORDWITHOUTUSER_IP
) {
1349 if(RecordsWithoutUser
== RECORDWITHOUTUSER_IGNORE
)
1351 if(RecordsWithoutUser
== RECORDWITHOUTUSER_EVERYBODY
)
1352 strcpy(user
,"everybody");
1355 if(NtlmUserFormat
== NTLMUSERFORMAT_USER
) {
1356 if((str
= strchr(user
,'_')) != 0) {
1357 strcpy(warea
,str
+1);
1360 if((str
= strchr(user
,'+')) != 0) {
1361 strcpy(warea
,str
+1);
1369 if(strcmp(user
,us
)!=0) continue;
1373 sprintf(wuser
,":%s:",user
);
1374 if(strstr(userfile
, wuser
) == 0)
1379 if(!vuexclude(user
)) {
1380 if (debugm
) printf(_("Excluded user: %s\n"),user
);
1386 if(strcmp(user
,"-") ==0 || strcmp(user
," ") ==0 || strcmp(user
,"") ==0 || strcmp(user
,":") ==0)
1390 if(atol(elap
)>max_elapsed
) {
1396 if((str
=(char *) strstr(linebuf
, "[SmartFilter:")) != (char *) NULL
) {
1398 sprintf(smartfilter
,"\"%s\"",str
+1);
1399 } else sprintf(smartfilter
,"\"\"");
1403 for (ufile
=first_user_file
; ufile
&& strcmp(user
,ufile
->user
->id
)!=0 ; ufile
=ufile
->next
) {
1405 if (ufile
->file
) nopen
++;
1408 ufile
=malloc(sizeof(*ufile
));
1410 debuga(_("Not enough memory to store the user %s\n"),user
);
1413 memset(ufile
,0,sizeof(*ufile
));
1414 ufile
->next
=first_user_file
;
1415 first_user_file
=ufile
;
1416 uinfo
=userinfo_create(user
);
1418 uinfo
->id_is_ip
=id_is_ip
;
1421 prev_ufile
->next
=ufile
->next
;
1422 ufile
->next
=first_user_file
;
1423 first_user_file
=ufile
;
1427 if (ufile
->file
==NULL
) {
1428 if (nopen
>=maxopenfiles
) {
1430 for (ufile1
=first_user_file
; ufile1
; ufile1
=ufile1
->next
) {
1431 if (ufile1
->file
!=NULL
) {
1432 if (x
>=maxopenfiles
) {
1433 if (fclose(ufile1
->file
)==EOF
) {
1434 debuga(_("Failed to close the log file of user %s - %s\n"),ufile1
->user
->id
,strerror(errno
));
1443 if (snprintf (tmp3
, sizeof(tmp3
), "%s/sarg/%s.unsort", tmp
, ufile
->user
->filename
)>=sizeof(tmp3
)) {
1444 debuga(_("Temporary user file name too long: %s/sarg/%s.unsort\n"), tmp
, ufile
->user
->filename
);
1447 if ((ufile
->file
= MY_FOPEN (tmp3
, "a")) == NULL
) {
1448 debuga(_("(log) Cannot open temporary file: %s - %s\n"), tmp3
, strerror(errno
));
1453 /*if ( strcmp ( user , sz_Last_User ) != 0 ) {
1454 if ( fp_Write_User )
1455 fclose( fp_Write_User ) ;
1456 sprintf (tmp3, "%s/sarg/%s.unsort", tmp, user);
1458 if ((fp_Write_User = MY_FOPEN (tmp3, "a")) == NULL) {
1459 fprintf (stderr, "%s: (log) %s: %s - %s\n", argv[0], _("Cannot open temporary file"), tmp3, strerror(errno));
1462 strcpy( sz_Last_User , user ) ;
1464 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) {
1465 debuga(_("Write error in the log file of user %s\n"),user
);
1469 if(fp_log
&& ilf
!=ILF_Sarg
)
1470 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
);
1474 if(!dataonly
&& download_flag
&& download_url
&& strstr(code
,"DENIED") == 0) {
1477 if ( ! fp_Download_Unsort
) {
1478 if ((fp_Download_Unsort
= MY_FOPEN ( sz_Download_Unsort
, "a")) == NULL
) {
1479 debuga(_("(log) Cannot open temporary file: %s - %s\n"),tmp3
, strerror(errno
));
1483 fprintf(fp_Download_Unsort
,"%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,download_url
);
1486 if((ReportType
& REPORT_TYPE_DENIED
) != 0 || (ReportType
& REPORT_TYPE_AUTH_FAILURES
) != 0) {
1487 if(fp_denied
&& strstr(code
,"DENIED/403") != 0) {
1488 fprintf(fp_denied
, "%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,urly
);
1491 if(fp_authfail
&& (strstr(code
,"DENIED/401") != 0 || strstr(code
,"DENIED/407") != 0)) {
1492 fprintf(fp_authfail
, "%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,urly
);
1497 if (ilf
!=ILF_Sarg
) {
1498 if(!totper
|| idata
<mindate
){
1500 memcpy(&period
.start
,t
,sizeof(*t
));
1501 strcpy(start_hour
,tbuf2
);
1503 if (!totper
|| idata
>maxdate
) {
1505 memcpy(&period
.end
,t
,sizeof(*t
));
1511 printf("IP=\t%s\n",ip
);
1512 printf("USER=\t%s\n",user
);
1513 printf("ELAP=\t%s\n",elap
);
1514 printf("DATE=\t%s\n",dia
);
1515 printf("TIME=\t%s\n",hora
);
1516 printf("FUNC=\t%s\n",fun
);
1517 printf("URL=\t%s\n",url
);
1518 printf("CODE=\t%s\n",code
);
1519 printf("LEN=\t%s\n",tam
);
1527 if( ShowReadStatistics
)
1528 printf(_("SARG: Records in file: %lu, reading: %3.2f%%\n"),recs1
, (float) 100 );
1533 debuga(_(" Records read: %ld, written: %ld, excluded: %ld\n"),totregsl
,totregsg
,totregsx
);
1535 longline_destroy(&line
);
1536 if ( fp_Download_Unsort
)
1537 fclose (fp_Download_Unsort
);
1539 for (ufile
=first_user_file
; ufile
; ufile
=ufile1
) {
1541 if (ufile
->file
!=NULL
) fclose(ufile
->file
);
1546 free_excludecodes();
1552 for (ilf
=0 ; ilf
<ILF_Last
; ilf
++) totalcount
+=ilf_count
[ilf
];
1554 if(ilf_count
[ILF_Common
]>0 && ilf_count
[ILF_Squid
]>0)
1555 debuga(_("Log with mixed records format (squid and common log)\n"));
1557 if(ilf_count
[ILF_Common
]>0 && ilf_count
[ILF_Squid
]==0)
1558 debuga(_("Common log format\n"));
1560 if(ilf_count
[ILF_Common
]==0 && ilf_count
[ILF_Squid
]>0)
1561 debuga(_("Squid log format\n"));
1563 if(ilf_count
[ILF_Sarg
]>0)
1564 debuga(_("Sarg log format\n"));
1566 if(totalcount
==0 && totregsg
)
1567 debuga(_("Log with invalid format\n"));
1571 debuga(_("No records found\n"));
1573 if(fp_denied
) fclose(fp_denied
);
1574 if(fp_authfail
) fclose(fp_authfail
);
1576 if(userfile
) free(userfile
);
1581 if (date
[0]!='\0') {
1582 char date0
[30], date1
[30];
1584 strftime(date0
,sizeof(date0
),"%d/%m/%Y",&period
.start
);
1585 strftime(date1
,sizeof(date1
),"%d/%m/%Y",&period
.end
);
1586 debuga(_("Period covered by log files: %s-%s\n"),date0
,date1
);
1587 getperiod_fromrange(&period
,dfrom
,duntil
);
1589 if (getperiod_buildtext(&period
)<0) {
1590 debuga(_("Failed to build the string representation of the date range\n"));
1595 debugaz("data",dia
);
1596 debugaz("period",period
.text
);
1600 debuga(_("Period: %s\n"),period
.text
);
1606 fclose(fp_authfail
);
1608 if(fp_log
!= NULL
) {
1610 strcpy(end_hour
,tbuf2
);
1611 strftime(val2
,sizeof(val2
),"%d%m%Y",&period
.start
);
1612 strftime(val1
,sizeof(val1
),"%d%m%Y",&period
.end
);
1613 sprintf(val4
,"%s/sarg-%s_%s-%s_%s.log",ParsedOutputLog
,val2
,start_hour
,val1
,end_hour
);
1614 if (rename(arq_log
,val4
)) {
1615 debuga(_("failed to rename %s to %s - %s\n"),arq_log
,val4
,strerror(errno
));
1617 strcpy(arq_log
,val4
);
1619 if(strcmp(ParsedOutputLogCompress
,"nocompress") != 0 && ParsedOutputLogCompress
[0] != '\0') {
1621 No double quotes around ParsedOutputLogCompress because it may contain command line options. If double quotes are
1622 necessary around the command name, put them in the configuration file.
1624 sprintf(val1
,"%s \"%s\"",ParsedOutputLogCompress
,arq_log
);
1625 cstatus
=system(val1
);
1626 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
1627 debuga(_("command return status %d\n"),WEXITSTATUS(cstatus
));
1628 debuga(_("command: %s\n"),val1
);
1634 debuga(_("Sarg parsed log saved as %s\n"),arq_log
);
1637 if(DataFile
[0] == '\0' && (ReportType
& REPORT_TYPE_DENIED
) != 0) {
1638 sprintf(csort
,"sort -T \"%s\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"",tmp
,denied_sort
,denied_unsort
);
1639 cstatus
=system(csort
);
1640 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
1641 debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus
));
1642 debuga(_("sort command: %s\n"),csort
);
1645 unlink(denied_unsort
);
1648 sort_users_log(tmp
, debug
);
1650 if(DataFile
[0] != '\0')
1656 if((ReportType
& REPORT_TYPE_DENIED
) != 0)
1657 unlink(denied_sort
);
1659 if(strcmp(tmp
,"/tmp") != 0) {
1676 static void getusers(const char *pwdfile
, int debug
)
1685 debuga(_("Loading password file from %s\n"),pwdfile
);
1687 if ((fp_usr
= fopen(pwdfile
, "r")) == NULL
) {
1688 debuga(_("(getusers) Cannot open file %s - %s\n"),pwdfile
,strerror(errno
));
1692 if (fseek(fp_usr
, 0, SEEK_END
)==-1) {
1693 debuga(_("Failed to move till the end of the users file %s: %s\n"),pwdfile
,strerror(errno
));
1696 nreg
= ftell(fp_usr
);
1698 debuga(_("Cannot get the size of file %s\n"),pwdfile
);
1702 if (fseek(fp_usr
, 0, SEEK_SET
)==-1) {
1703 debuga(_("Failed to rewind the users file %s: %s\n"),pwdfile
,strerror(errno
));
1707 if((userfile
=(char *) malloc(nreg
))==NULL
){
1708 debuga(_("malloc error (%ld)\n"),nreg
);
1712 bzero(userfile
,nreg
);
1713 strcpy(userfile
,":");
1715 while(fgets(buf
,sizeof(buf
),fp_usr
)!=NULL
) {
1716 str
=strchr(buf
,':');
1718 debuga(_("You have an invalid user in your %s file\n"),pwdfile
);
1722 strcat(userfile
,buf
);