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
];
101 char hexclude
[MAXLEN
];
108 char denied_unsort
[MAXLEN
];
109 char denied_sort
[MAXLEN
];
110 char authfail_unsort
[MAXLEN
];
111 char start_hour
[128];
117 char user
[MAX_USER_LEN
];
118 enum InputLogFormat ilf
;
119 int ilf_count
[ILF_Last
];
131 int isa_ncols
=0,isa_cols
[ISACOL_Last
];
142 long int max_elapsed
=0;
143 long long int iyear
, imonth
, iday
;
148 unsigned long recs1
=0UL;
149 unsigned long recs2
=0UL;
150 int OutputNonZero
= REPORT_EVERY_X_LINES
;
151 bool download_flag
=false;
152 char *download_url
=NULL
;
153 struct getwordstruct gwarea
;
157 struct userinfostruct
*uinfo
;
158 struct userfilestruct
*first_user_file
, *ufile
, *ufile1
, *prev_ufile
;
160 static int convert
=0;
161 static int output_css
=0;
163 static struct option long_options
[]=
165 {"convert",no_argument
,&convert
,1},
166 {"css",no_argument
,&output_css
,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 TopuserSort
=TOPUSER_SORT_BYTES
| TOPUSER_SORT_REVERSE
;
237 UserSort
=USER_SORT_BYTES
| USER_SORT_REVERSE
;
238 TopsitesSort
=TOPSITE_SORT_CONNECT
| TOPSITE_SORT_REVERSE
;
240 strcpy(FontFace
,"Verdana,Tahoma,Arial");
241 datetimeby
=DATETIME_BYTE
;
242 strcpy(CharSet
,"ISO-8859-1");
244 strcpy(PrivacyString
,"***.***.***.***");
245 strcpy(PrivacyStringColor
,"blue");
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
;
254 strcpy(DataFileDelimiter
,";");
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
;
257 ShowReadStatistics
=true;
258 strcpy(IndexSortOrder
,"D");
261 strcpy(ParsedOutputLog
,"no");
262 strcpy(ParsedOutputLogCompress
,"/bin/gzip -f");
263 DisplayedValues
=DISPLAY_ABBREV
;
264 strcpy(HeaderFontSize
,"9px");
265 strcpy(TitleFontSize
,"11px");
266 strcpy(AuthUserTemplateFile
,"sarg_htaccess");
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");
270 strcpy(GraphFont
,FONTDIR
"/DejaVuSans.ttf");
274 strcpy(Ulimit
,"20000");
275 NtlmUserFormat
=NTLMUSERFORMAT_DOMAINUSER
;
276 IndexTree
=INDEX_TREE_FILE
;
277 strcpy(RealtimeTypes
,"GET,PUT,CONNECT");
278 RealtimeUnauthRec
=REALTIME_UNAUTH_REC_SHOW
;
279 RedirectorFilterOutDate
=true;
280 DansguardianFilterOutDate
=true;
281 DataFileUrl
=DATAFILEURL_IP
;
282 strcpy(MaxElapsed
,"28800000");
283 BytesInSitesUsersReport
=0;
284 UserAuthentication
=0;
285 strcpy(LDAPHost
,"127.0.0.1");
287 LDAPProtocolVersion
=3;
290 LDAPBaseSearch
[0]='\0';
291 strcpy(LDAPFilterSearch
, "(uid=%s)");
292 strcpy(LDAPTargetAttr
, "cn");
315 UserInvalidChar
[0]='\0';
317 SquidGuardConf
[0]='\0';
318 DansGuardianConf
[0]='\0';
325 dansguardian_count
=0;
328 DeniedReportLimit
=10;
329 AuthfailReportLimit
=10;
330 DansGuardianReportLimit
=10;
331 SquidGuardReportLimit
=10;
332 DownloadReportLimit
=50;
341 realtime_access_log_lines
=1000;
349 bzero(IncludeUsers
, sizeof(IncludeUsers
));
350 bzero(ExcludeString
, sizeof(ExcludeString
));
351 first_user_file
=NULL
;
352 memset(&period
,0,sizeof(period
));
355 for(x
=0; x
<MAXLOGS
; x
++)
356 AccessLog
[x
][0]='\0';
357 AccessLogFromCmdLine
=0;
358 RedirectorLogFromCmdLine
=0;
360 strcpy(Title
,_("Squid User Access Report"));
362 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){
371 strcpy(uagent
,optarg
);
374 strcpy(hexclude
,optarg
);
377 strncpy(date
,optarg
,sizeof(date
)-1);
378 date
[sizeof(date
)-1]='\0';
379 date_from(date
, &dfrom
, &duntil
);
382 strcpy(email
,optarg
);
385 strcpy(ConfigFile
,optarg
);
397 if (NAccessLog
>=MAXLOGS
) {
398 debuga(_("Too many log files passed on command line with option -l.\n"));
401 if (strlen(optarg
)>=MAX_LOG_FILELEN
) {
402 debuga(_("Log file name too long passed on command line with option -l: %s\n"),optarg
);
405 strcpy(AccessLog
[NAccessLog
],optarg
);
407 AccessLogFromCmdLine
++;
410 if (NRedirectorLogs
>MAX_REDIRECTOR_LOGS
) {
411 debuga(_("Too many redirector logs passed on command line with option -L.\n"));
414 if (strlen(optarg
)>=MAX_REDIRECTOR_FILELEN
) {
415 debuga(_("Redirector log file name too long passed on command line with opton -L: %s\n"),optarg
);
418 strcpy(RedirectorLogs
[NRedirectorLogs
],optarg
);
420 RedirectorLogFromCmdLine
++;
429 strcpy(outdir
,optarg
);
444 if(strstr(optarg
,"-") == 0) {
445 if(sscanf(optarg
,"%d:%d",&h1
,&m1
)!=2) {
446 debuga(_("Time period passed on the command line with option -t must be MM:SS\n"));
451 snprintf(hm_str
,sizeof(hm_str
),"%02d:%02d",h1
,m1
);
453 if(sscanf(optarg
,"%d:%d-%d:%d",&h1
,&m1
,&h2
,&m2
)!=4) {
454 debuga(_("Time range passed on the command line with option -t must be MM:SS-MM:SS\n"));
459 snprintf(hm_str
,sizeof(hm_str
),"%02d:%02d-%02d:%02d",h1
,m1
,h2
,m2
);
482 debuga(_("Option -%c require an argument\n"),optopt);
499 for (iarq
=optind
; iarq
<argc
; iarq
++) {
500 if (NAccessLog
>=MAXLOGS
) {
501 debuga(_("Too many log files passed on command line.\n"));
504 if (strlen(argv
[iarq
])>=MAX_LOG_FILELEN
) {
505 debuga(_("Log file name too long passed on command line: %s\n"),argv
[iarq
]);
508 strcpy(AccessLog
[NAccessLog
],argv
[iarq
]);
510 AccessLogFromCmdLine
++;
514 if(debug
) debuga(_("Init\n"));
516 if(ConfigFile
[0] == '\0') snprintf(ConfigFile
,sizeof(ConfigFile
),"%s/sarg.conf",SYSCONFDIR
);
517 if(access(ConfigFile
, R_OK
) != 0) {
518 debuga(_("Cannot open config file: %s - %s\n"),ConfigFile
,strerror(errno
));
522 if(access(ConfigFile
, R_OK
) == 0)
525 if(userip
) UserIp
=true;
527 if(dns
) Ip2Name
=true;
534 if(IndexTree
== INDEX_TREE_FILE
)
535 strcpy(ImageFile
,"../images");
537 strcpy(ImageFile
,"../../../images");
540 if(DataFile
[0] != '\0')
543 if(NAccessLog
== 0) {
544 strcpy(AccessLog
[0],"/var/log/squid/access.log");
553 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++)
554 splitlog(AccessLog
[iarq
], df
, dfrom
, duntil
, convert
);
558 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++)
559 convlog(AccessLog
[iarq
], df
, dfrom
, duntil
);
563 load_excludecodes(ExcludeCodes
);
565 if(access(PasswdFile
, R_OK
) == 0) {
566 getusers(PasswdFile
,debug
);
570 if(hexclude
[0] == '\0')
571 strcpy(hexclude
,ExcludeHosts
);
572 if(hexclude
[0] != '\0') {
573 gethexclude(hexclude
,debug
);
577 if(ReportType
== 0) {
578 ReportType
=REPORT_TYPE_TOPUSERS
| REPORT_TYPE_TOPSITES
| REPORT_TYPE_USERS_SITES
|
579 REPORT_TYPE_SITES_USERS
| REPORT_TYPE_DATE_TIME
| REPORT_TYPE_DENIED
|
580 REPORT_TYPE_AUTH_FAILURES
| REPORT_TYPE_SITE_USER_TIME_DATE
| REPORT_TYPE_DOWNLOADS
;
583 if(access(ExcludeUsers
, R_OK
) == 0) {
584 getuexclude(ExcludeUsers
,debug
);
593 if(strcmp(ExcludeUsers
,"indexonly") == 0) indexonly
++;
594 if(Index
== INDEX_ONLY
) indexonly
++;
596 if(MaxElapsed
[0] != '\0') max_elapsed
=atol(MaxElapsed
);
598 if(outdir
[0] == '\0') strcpy(outdir
,OutputDir
);
601 if(uagent
[0] == '\0') strcpy(uagent
,UserAgentLog
);
603 if(tmp
[0] == '\0') strcpy(tmp
,TempDir
);
604 else strcpy(TempDir
,tmp
);
606 For historical reasons, the temporary directory is the subdirectory "sarg" of the path
607 provided by the user.
611 if (tmp
[0]!='\0' && strncmp(outdir
,tmp
,strlen(tmp
))==0) {
612 debuga(_("The output directory \"%s\" must be outside of the temporary directory \"%s\"\n"),outdir
,tmp
);
616 if(df
[0] == '\0') strcpy(df
,DateFormat
);
617 else strcpy(DateFormat
,df
);
621 strcpy(DateFormat
,"u");
624 IndexTree
=INDEX_TREE_FILE
;
626 if(email
[0] == '\0' && OutputEmail
[0] != '\0') strcpy(email
,OutputEmail
);
628 if(email
[0] != '\0') {
634 if(access(tmp
, R_OK
) == 0) {
638 snprintf(denied_unsort
,sizeof(denied_unsort
),"%s/denied.log.unsort",tmp
);
639 snprintf(denied_sort
,sizeof(denied_sort
),"%s/denied.log",tmp
);
640 snprintf(authfail_unsort
,sizeof(authfail_unsort
),"%s/authfail.log.unsort",tmp
);
643 debuga(_("Parameters:\n"));
644 debuga(_(" Hostname or IP address (-a) = %s\n"),addr
);
645 debuga(_(" Useragent log (-b) = %s\n"),uagent
);
646 debuga(_(" Exclude file (-c) = %s\n"),hexclude
);
647 debuga(_(" Date from-until (-d) = %s\n"),date
);
648 debuga(_(" Email address to send reports (-e) = %s\n"),email
);
649 debuga(_(" Config file (-f) = %s\n"),ConfigFile
);
650 if(strcmp(df
,"e") == 0)
651 debuga(_(" Date format (-g) = Europe (dd/mm/yyyy)\n"));
652 if(strcmp(df
,"u") == 0)
653 debuga(_(" Date format (-g) = USA (mm/dd/yyyy)\n"));
654 if(strcmp(df
,"w") == 0)
655 debuga(_(" Date format (-g) = Sites & Users (yyyy/ww)\n"));
656 debuga(_(" IP report (-i) = %s\n"),(iprel
) ? _("Yes") : _("No"));
657 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++)
658 debuga(_(" Input log (-l) = %s\n"),AccessLog
[iarq
]);
659 for (iarq
=0 ; iarq
<NRedirectorLogs
; iarq
++)
660 debuga(_(" Redirector log (-L) = %s\n"),RedirectorLogs
[iarq
]);
661 debuga(_(" Resolve IP Address (-n) = %s\n"),(Ip2Name
) ? _("Yes") : _("No"));
662 debuga(_(" Output dir (-o) = %s\n"),outdir
);
663 debuga(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp
) ? _("Yes") : _("No"));
664 debuga(_(" Accessed site (-s) = %s\n"),site
);
665 debuga(_(" Time (-t) = %s\n"),hm_str
);
666 debuga(_(" User (-u) = %s\n"),us
);
667 debuga(_(" Temporary dir (-w) = %s\n"),tmp
);
668 debuga(_(" Debug messages (-x) = %s\n"),(debug
) ? _("Yes") : _("No"));
669 debuga(_(" Process messages (-z) = %s\n"),(debugz
) ? _("Yes") : _("No"));
674 printf(_("Parameters:\n"));
675 printf(_(" Hostname or IP address (-a) = %s\n"),addr
);
676 printf(_(" Useragent log (-b) = %s\n"),uagent
);
677 printf(_(" Exclude file (-c) = %s\n"),hexclude
);
678 printf(_(" Date from-until (-d) = %s\n"),date
);
679 printf(_(" Email address to send reports (-e) = %s\n"),email
);
680 printf(_(" Config file (-f) = %s\n"),ConfigFile
);
681 if(strcmp(df
,"e") == 0)
682 printf(_(" Date format (-g) = Europe (dd/mm/yyyy)\n"));
683 if(strcmp(df
,"u") == 0)
684 printf(_(" Date format (-g) = USA (mm/dd/yyyy)\n"));
685 if(strcmp(df
,"w") == 0)
686 printf(_(" Date format (-g) = Sites & Users (yyyy/ww)\n"));
687 printf(_(" IP report (-i) = %s\n"),(iprel
) ? _("Yes") : _("No"));
688 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++)
689 printf(_(" Input log (-l) = %s\n"),AccessLog
[iarq
]);
690 for (iarq
=0 ; iarq
<NRedirectorLogs
; iarq
++)
691 printf(_(" Redirector log (-L) = %s\n"),RedirectorLogs
[iarq
]);
692 printf(_(" Resolve IP Address (-n) = %s\n"),(Ip2Name
) ? _("Yes") : _("No"));
693 printf(_(" Output dir (-o) = %s\n"),outdir
);
694 printf(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp
) ? _("Yes") : _("No"));
695 printf(_(" Accessed site (-s) = %s\n"),site
);
696 printf(_(" Time (-t) = %s\n"),hm_str
);
697 printf(_(" User (-u) = %s\n"),us
);
698 printf(_(" Temporary dir (-w) = %s\n"),tmp
);
699 printf(_(" Debug messages (-x) = %s\n"),(debug
) ? _("Yes") : _("No"));
700 printf(_(" Process messages (-z) = %s\n"),(debugz
) ? _("Yes") : _("No"));
701 printf(_("sarg version: %s\n"),VERSION
);
705 debuga(_("sarg version: %s\n"),VERSION
);
707 #ifdef ENABLE_DOUBLE_CHECK_DATA
708 debuga(_("Sarg compiled to report warnings if the output is inconsistent\n"));
711 maxopenfiles
=MAX_OPEN_USER_FILES
;
713 if (Ulimit
[0] != '\0') {
718 #if defined(RLIMIT_NOFILE)
719 getrlimit (RLIMIT_NOFILE
, &rl
);
720 #elif defined(RLIMIT_OFILE)
721 getrlimit (RLIMIT_OFILE
, &rl
);
723 #warning "No rlimit resource for the number of open files"
728 rl
.rlim_cur
= atol(Ulimit
);
729 rl
.rlim_max
= atol(Ulimit
);
730 #if defined(RLIMIT_NOFILE)
731 rc
=setrlimit (RLIMIT_NOFILE
, &rl
);
732 #elif defined(RLIMIT_OFILE)
733 rc
=setrlimit (RLIMIT_OFILE
, &rl
);
735 #warning "No rlimit resource for the number of open files"
738 debuga(_("setrlimit error - %s\n"),strerror(errno
));
742 debuga("Maximum file descriptor: cur=%ld max=%ld, changed to cur="RLIM_STRING
" max="RLIM_STRING
,l1
,l2
,rl
.rlim_cur
,rl
.rlim_max
);
746 init_usertab(UserTabFile
);
748 if ((line
=longline_create())==NULL
) {
749 debuga(_("Not enough memory to read a log file\n"));
753 snprintf(sz_Download_Unsort
,sizeof(sz_Download_Unsort
),"%s/download.unsort", tmp
);
755 if(DataFile
[0]=='\0') {
756 if((ReportType
& REPORT_TYPE_DENIED
) != 0) {
757 if((fp_denied
=MY_FOPEN(denied_unsort
,"w"))==NULL
) {
758 debuga(_("(log) Cannot open file: %s - %s\n"),denied_unsort
,strerror(errno
));
763 if((ReportType
& REPORT_TYPE_DENIED
) != 0 || (ReportType
& REPORT_TYPE_AUTH_FAILURES
) != 0) {
764 if((fp_authfail
=MY_FOPEN(authfail_unsort
,"w"))==NULL
) {
765 debuga(_("(log) Cannot open file: %s - %s\n"),authfail_unsort
,strerror(errno
));
771 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++) {
772 strcpy(arq
,AccessLog
[iarq
]);
776 if(strcmp(arq
,"-")==0) {
778 debuga(_("Reading access log file: from stdin\n"));
783 if (stat(arq
,&logstat
)!=0) {
784 debuga(_("Cannot get the modification time of input log file %s (%s). Processing it anyway\n"),arq
,strerror(errno
));
786 struct tm
*logtime
=localtime(&logstat
.st_mtime
);
787 if ((logtime
->tm_year
+1900)*10000+(logtime
->tm_mon
+1)*100+logtime
->tm_mday
<dfrom
) {
788 debuga(_("Ignoring old log file %s\n"),arq
);
793 fp_in
=decomp(arq
,&from_pipe
);
795 debuga(_("(log) Cannot open log file: %s - %s\n"),arq
,strerror(errno
));
798 if(debug
) debuga(_("Reading access log file: %s\n"),arq
);
803 // pre-read the file only if we have to show stats
804 if(ShowReadStatistics
&& !from_stdin
&& !from_pipe
) {
812 while ((nread
=fread(tmp4
,1,sizeof(tmp4
),fp_in
))>0) {
813 for (i
=0 ; i
<nread
; i
++)
815 if (tmp4
[i
]!='\n' && tmp4
[i
]!='\r') {
819 if (tmp4
[i
]=='\n' || tmp4
[i
]=='\r') {
826 printf(_("SARG: Records in file: %lu, reading: %3.2f%%"),recs1
,(float) 0);
831 longline_reset(line
);
833 while ((linebuf
=longline_read(fp_in
,line
))!=NULL
) {
834 blen
=strlen(linebuf
);
836 if (ilf
==ILF_Unknown
) {
837 if(strncmp(linebuf
,"#Software: Mic",14) == 0) {
838 fixendofline(linebuf
);
840 debuga(_("Log is from Microsoft ISA: %s\n"),linebuf
);
846 if(strncmp(linebuf
,"*** SARG Log ***",16) == 0) {
847 if (getperiod_fromsarglog(arqtt
,&period
)<0) {
848 debuga(_("The name of the file is invalid: %s\n"),arq
);
857 if(!fp_log
&& strcmp(ParsedOutputLog
, "no") != 0 && ilf
!=ILF_Sarg
) {
858 if(access(ParsedOutputLog
,R_OK
) != 0) {
859 my_mkdir(ParsedOutputLog
);
861 sprintf(arq_log
,"%s/sarg_temp.log",ParsedOutputLog
);
862 if((fp_log
=MY_FOPEN(arq_log
,"w"))==NULL
) {
863 debuga(_("(log) Cannot open log file: %s - %s\n"),arq_log
,strerror(errno
));
866 fputs("*** SARG Log ***\n",fp_log
);
870 if( ShowReadStatistics
&& !from_stdin
&& !from_pipe
&& --OutputNonZero
<=0) {
871 double perc
= recs2
* 100. / recs1
;
872 printf(_("SARG: Records in file: %lu, reading: %3.2lf%%"),recs2
,perc
);
875 OutputNonZero
= REPORT_EVERY_X_LINES
;
877 if(blen
< 58) continue;
878 if(strstr(linebuf
,"HTTP/0.0") != 0) continue;
879 if(strstr(linebuf
,"logfile turned over") != 0) continue;
880 if(linebuf
[0] == ' ') continue;
883 if(ExcludeString
[0] != '\0') {
885 getword_start(&gwarea
,ExcludeString
);
886 while(strchr(gwarea
.current
,':') != 0) {
887 if (getword_multisep(val1
,sizeof(val1
),&gwarea
,':')<0) {
888 debuga(_("Maybe you have a broken record or garbage in your exclusion string\n"));
891 if((str
=(char *) strstr(linebuf
,val1
)) != (char *) NULL
) {
896 if(!exstring
&& (str
=(char *) strstr(linebuf
,gwarea
.current
)) != (char *) NULL
)
898 if(exstring
) continue;
903 printf("BUF=%s\n",linebuf
);
906 if (ilf
==ILF_Squid
|| ilf
==ILF_Common
|| ilf
==ILF_Unknown
) {
907 getword_start(&gwarea
,linebuf
);
908 if (getword(data
,sizeof(data
),&gwarea
,' ')<0) {
909 debuga(_("Maybe you have a broken time in your access.log file\n"));
912 if((str
=(char *) strchr(data
, '.')) != (char *) NULL
&& (str
=(char *) strchr(str
+1, '.')) != (char *) NULL
) {
916 if (getword(user
,sizeof(user
),&gwarea
,' ')<0 || getword_skip(255,&gwarea
,' ')<0) {
917 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
921 if (getword_skip(255,&gwarea
,' ')<0 || getword(user
,sizeof(user
),&gwarea
,' ')<0) {
922 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
926 if (getword(data
,sizeof(data
),&gwarea
,']')<0 || getword_skip(MAXLEN
,&gwarea
,'"')<0 ||
927 getword(fun
,sizeof(fun
),&gwarea
,' ')<0) {
928 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
931 if (getword_ptr(linebuf
,&url
,&gwarea
,' ')<0) {
932 debuga(_("Maybe you have a broken url in your %s file\n"),arq
);
935 if (getword_skip(MAXLEN
,&gwarea
,' ')<0) {
936 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
939 if (getword(code2
,sizeof(code2
),&gwarea
,' ')<0) {
940 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
943 if (getword(tam
,sizeof(tam
),&gwarea
,' ')<0) {
944 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
947 if((str
=(char *) strchr(gwarea
.current
, ' ')) != (char *) NULL
) {
948 if (getword(code
,sizeof(code
),&gwarea
,' ')<0) {
949 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
953 if (getword(code
,sizeof(code
),&gwarea
,'\0')<0) {
954 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
959 if ((str
= strchr(code
, ':')) != NULL
)
962 if(strcmp(tam
,"\0") == 0)
968 getword_start(&gwarea
,data
+1);
969 if (getword_multisep(data
,sizeof(data
),&gwarea
,':')<0){
970 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
973 if (getword_multisep(hora
,sizeof(hora
),&gwarea
,' ')<0){
974 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
977 getword_start(&gwarea
,data
);
978 if (getword_atoll(&iday
,&gwarea
,'/')<0){
979 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
982 if (getword(mes
,sizeof(mes
),&gwarea
,'/')<0){
983 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
986 if (getword_atoll(&iyear
,&gwarea
,'/')<0){
987 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
991 imonth
=month2num(mes
)+1;
992 idata
=builddia(iday
,imonth
,iyear
);
993 computedate(iyear
,imonth
,iday
,&tt
);
997 if(ilf
==ILF_Unknown
|| ilf
==ILF_Squid
) {
998 if (getword(elap
,sizeof(elap
),&gwarea
,' ')<0) {
999 debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq
);
1002 while(strcmp(elap
,"") == 0 && gwarea
.current
[0] != '\0')
1003 if (getword(elap
,sizeof(elap
),&gwarea
,' ')<0) {
1004 debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq
);
1007 if(strlen(elap
) < 1) continue;
1008 if (getword(ip
,sizeof(ip
),&gwarea
,' ')<0){
1009 debuga(_("Maybe you have a broken client IP address in your %s file\n"),arq
);
1012 if (getword(code
,sizeof(code
),&gwarea
,' ')<0){
1013 debuga(_("Maybe you have a broken result code in your %s file\n"),arq
);
1016 if (getword(tam
,sizeof(tam
),&gwarea
,' ')<0){
1017 debuga(_("Maybe you have a broken amount of data in your %s file\n"),arq
);
1020 if (getword(fun
,sizeof(fun
),&gwarea
,' ')<0){
1021 debuga(_("Maybe you have a broken request method in your %s file\n"),arq
);
1024 if (getword_ptr(linebuf
,&url
,&gwarea
,' ')<0){
1025 debuga(_("Maybe you have a broken url in your %s file\n"),arq
);
1028 if (getword(user
,sizeof(user
),&gwarea
,' ')<0){
1029 debuga(_("Maybe you have a broken user ID in your %s file\n"),arq
);
1038 debuga(_("Cannot convert the timestamp from the squid log file\n"));
1042 strftime(tbuf2
, sizeof(tbuf2
), "%H%M", t
);
1044 idata
=(t
->tm_year
+1900)*10000+(t
->tm_mon
+1)*100+t
->tm_mday
;
1047 if (ilf
==ILF_Sarg
) {
1048 getword_start(&gwarea
,linebuf
);
1049 if (getword(data
,sizeof(data
),&gwarea
,'\t')<0){
1050 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1053 if (getword(hora
,sizeof(hora
),&gwarea
,'\t')<0) {
1054 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1057 if (getword(user
,sizeof(user
),&gwarea
,'\t')<0) {
1058 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1061 if (getword(ip
,sizeof(ip
),&gwarea
,'\t')<0) {
1062 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1065 if (getword_ptr(linebuf
,&url
,&gwarea
,'\t')<0){
1066 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1069 if (getword(tam
,sizeof(tam
),&gwarea
,'\t')<0){
1070 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1073 if (getword(code
,sizeof(code
),&gwarea
,'\t')<0){
1074 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1077 if (getword(elap
,sizeof(elap
),&gwarea
,'\t')<0){
1078 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1081 if (getword(smartfilter
,sizeof(smartfilter
),&gwarea
,'\0')<0){
1082 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1085 getword_start(&gwarea
,data
);
1086 if (getword_atoll(&iday
,&gwarea
,'/')<0 || iday
<1 || iday
>31){
1087 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1090 if (getword_atoll(&imonth
,&gwarea
,'/')<0 || imonth
<1 || imonth
>12){
1091 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1094 if (getword_atoll(&iyear
,&gwarea
,'\0')<0){
1095 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1098 idata
=builddia(iday
,imonth
,iyear
);
1099 computedate(iyear
,imonth
,iday
,&tt
);
1103 if (linebuf
[0] == '#') {
1104 int ncols
,cols
[ISACOL_Last
];
1106 fixendofline(linebuf
);
1107 getword_start(&gwarea
,linebuf
);
1108 // remove the #Fields: column at the beginning of the line
1109 if (getword_skip(1000,&gwarea
,' ')<0){
1110 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1113 for (ncols
=0 ; ncols
<ISACOL_Last
; ncols
++) cols
[ncols
]=-1;
1115 while(gwarea
.current
[0] != '\0') {
1116 if (getword(val1
,sizeof(val1
),&gwarea
,'\t')<0){
1117 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1120 if(strcmp(val1
,"c-ip") == 0) cols
[ISACOL_Ip
]=ncols
;
1121 if(strcmp(val1
,"cs-username") == 0) cols
[ISACOL_UserName
]=ncols
;
1122 if(strcmp(val1
,"date") == 0) cols
[ISACOL_Date
]=ncols
;
1123 if(strcmp(val1
,"time") == 0) cols
[ISACOL_Time
]=ncols
;
1124 if(strcmp(val1
,"time-taken") == 0) cols
[ISACOL_TimeTaken
]=ncols
;
1125 if(strcmp(val1
,"sc-bytes") == 0) cols
[ISACOL_Bytes
]=ncols
;
1126 if(strcmp(val1
,"cs-uri") == 0) cols
[ISACOL_Uri
]=ncols
;
1127 if(strcmp(val1
,"sc-status") == 0) cols
[ISACOL_Status
]=ncols
;
1130 if (cols
[ISACOL_Ip
]>=0) {
1132 for (ncols
=0 ; ncols
<ISACOL_Last
; ncols
++)
1133 isa_cols
[ncols
]=cols
[ncols
];
1137 if (!isa_ncols
) continue;
1138 getword_start(&gwarea
,linebuf
);
1139 for (x
=0 ; x
<isa_ncols
; x
++) {
1140 if (getword_ptr(linebuf
,&str
,&gwarea
,'\t')<0) {
1141 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1144 if (x
==isa_cols
[ISACOL_Ip
]) {
1145 if (strlen(str
)>=sizeof(ip
)) {
1146 debuga(_("Maybe you have a broken IP in your %s file\n"),arq
);
1150 } else if (x
==isa_cols
[ISACOL_UserName
]) {
1151 if (strlen(str
)>=sizeof(user
)) {
1152 debuga(_("Maybe you have a broken user ID in your %s file\n"),arq
);
1156 } else if (x
==isa_cols
[ISACOL_Date
]) {
1157 if (strlen(str
)>=sizeof(data
)) {
1158 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1162 } else if (x
==isa_cols
[ISACOL_Time
]) {
1163 if (strlen(str
)>=sizeof(hora
)) {
1164 debuga(_("Maybe you have a broken time in your %s file\n"),arq
);
1168 } else if (x
==isa_cols
[ISACOL_TimeTaken
]) {
1169 if (strlen(str
)>=sizeof(elap
)) {
1170 debuga(_("Maybe you have a broken download duration in your %s file\n"),arq
);
1174 } else if (x
==isa_cols
[ISACOL_Bytes
]) {
1175 if (strlen(str
)>=sizeof(tam
)) {
1176 debuga(_("Maybe you have a broken download size in your %s file\n"),arq
);
1180 } else if (x
==isa_cols
[ISACOL_Uri
]) {
1182 } else if (x
==isa_cols
[ISACOL_Status
]) {
1183 if (strlen(str
)>=sizeof(code
)) {
1184 debuga(_("Maybe you have a broken access code in your %s file\n"),arq
);
1191 if(strcmp(code
,"401") == 0 || strcmp(code
,"403") == 0 || strcmp(code
,"407") == 0) {
1192 sprintf(val1
,"DENIED/%s",code
);
1195 getword_start(&gwarea
,data
);
1196 if (getword_atoll(&iyear
,&gwarea
,'-')<0){
1197 debuga(_("Maybe you have a broken year in your %s file\n"),arq
);
1200 if (getword_atoll(&imonth
,&gwarea
,'-')<0){
1201 debuga(_("Maybe you have a broken month in your %s file\n"),arq
);
1204 if (getword_atoll(&iday
,&gwarea
,'\0')<0){
1205 debuga(_("Maybe you have a broken day in your %s file\n"),arq
);
1209 idata
=builddia(iday
,imonth
,iyear
);
1210 computedate(iyear
,imonth
,iday
,&tt
);
1214 debuga(_("Unknown input log file format\n"));
1218 strftime(dia
, sizeof(dia
), "%d/%m/%Y", t
);
1219 snprintf(hora
,sizeof(hora
),"%02d:%02d:%02d",t
->tm_hour
,t
->tm_min
,t
->tm_sec
);
1222 printf("DATE=%s IDATA=%d DFROM=%d DUNTIL=%d\n",date
,idata
,dfrom
,duntil
);
1224 if(date
[0] != '\0'){
1225 if(idata
< dfrom
|| idata
> duntil
) continue;
1228 // Record only hours usage which is required
1230 if( bsearch( &( t
-> tm_wday
), weekdays
.list
, weekdays
.len
,
1231 sizeof( int ), compar
) == NULL
)
1234 if( bsearch( &( t
-> tm_hour
), hours
.list
, hours
.len
,
1235 sizeof( int ), compar
) == NULL
)
1240 if(strlen(user
) > MAX_USER_LEN
) {
1241 if (debugm
) printf(_("User ID too long: %s\n"),user
);
1247 if(IncludeUsers
[0] != '\0') {
1248 sprintf(val1
,":%s:",user
);
1249 if((str
=(char *) strstr(IncludeUsers
,val1
)) == (char *) NULL
)
1254 if (debugm
) printf(_("Excluded code: %s\n"),code
);
1259 if(testvaliduserchar(user
))
1263 if((str
= strstr(user
,"%20")) != NULL
) {
1265 This is a patch introduced to solve bug #1624251 reported at sourceforge but
1266 the side effect is to truncate the name at the first space and merge the reports
1267 of people whose name is identical up to the first space.
1269 The old code used to truncate the user name at the first % if a %20 was
1270 found anywhere in the string. That means the string could be truncated
1271 at the wrong place if another % occured before the %20. This new code should
1272 avoid that problem and only truncate at the space. There is no bug
1273 report indicating that anybody noticed this.
1279 Code prior to 2.2.7 used to replace any %xx by a dot as long as a %5c was
1280 found in the user name.
1282 while((str
= strstr(user
,"%5c")) != NULL
) {
1284 for (x
=3 ; str
[x
] ; x
++) str
[x
-2]=str
[x
];
1292 The full URL is not saved in sarg log. There is no point in testing the URL to detect
1295 download_flag
=is_download_suffix(url
);
1296 if (download_flag
) {
1301 download_flag
=false;
1303 // remove any protocol:// at the beginning of the URL
1304 if ((str
= strchr(url
,'/')) != NULL
&& str
[1] == '/') {
1308 for (i
=0 ; str
[i
] ; i
++)
1314 url_hostname(url
,hostname
,sizeof(hostname
));
1318 if(url
[0] == '\0') continue;
1320 if(addr
[0] != '\0'){
1321 if(strcmp(addr
,ip
)!=0) continue;
1324 if(!vhexclude(url
)) {
1325 if (debugm
) printf(_("Excluded site: %s\n"),url
);
1331 if(hm
>= 0 && hmf
>= 0) {
1332 hmr
=t
->tm_hour
*100+t
->tm_min
;
1333 if(hmr
< hm
|| hmr
> hmf
) continue;
1336 if(site
[0] != '\0'){
1337 if(strstr(url
,site
)==0) continue;
1345 if(strcmp(user
,"-") == 0 || strcmp(user
," ") == 0 || strcmp(user
,"") == 0) {
1346 if(RecordsWithoutUser
== RECORDWITHOUTUSER_IP
) {
1350 if(RecordsWithoutUser
== RECORDWITHOUTUSER_IGNORE
)
1352 if(RecordsWithoutUser
== RECORDWITHOUTUSER_EVERYBODY
)
1353 strcpy(user
,"everybody");
1356 if(NtlmUserFormat
== NTLMUSERFORMAT_USER
) {
1357 if((str
= strchr(user
,'_')) != 0) {
1358 strcpy(warea
,str
+1);
1361 if((str
= strchr(user
,'+')) != 0) {
1362 strcpy(warea
,str
+1);
1370 if(strcmp(user
,us
)!=0) continue;
1374 sprintf(wuser
,":%s:",user
);
1375 if(strstr(userfile
, wuser
) == 0)
1380 if(!vuexclude(user
)) {
1381 if (debugm
) printf(_("Excluded user: %s\n"),user
);
1387 if(strcmp(user
,"-") ==0 || strcmp(user
," ") ==0 || strcmp(user
,"") ==0 || strcmp(user
,":") ==0)
1391 if(atol(elap
)>max_elapsed
) {
1397 if((str
=(char *) strstr(linebuf
, "[SmartFilter:")) != (char *) NULL
) {
1399 sprintf(smartfilter
,"\"%s\"",str
+1);
1400 } else sprintf(smartfilter
,"\"\"");
1404 for (ufile
=first_user_file
; ufile
&& strcmp(user
,ufile
->user
->id
)!=0 ; ufile
=ufile
->next
) {
1406 if (ufile
->file
) nopen
++;
1409 ufile
=malloc(sizeof(*ufile
));
1411 debuga(_("Not enough memory to store the user %s\n"),user
);
1414 memset(ufile
,0,sizeof(*ufile
));
1415 ufile
->next
=first_user_file
;
1416 first_user_file
=ufile
;
1417 uinfo
=userinfo_create(user
);
1419 uinfo
->id_is_ip
=id_is_ip
;
1422 prev_ufile
->next
=ufile
->next
;
1423 ufile
->next
=first_user_file
;
1424 first_user_file
=ufile
;
1428 if (ufile
->file
==NULL
) {
1429 if (nopen
>=maxopenfiles
) {
1431 for (ufile1
=first_user_file
; ufile1
; ufile1
=ufile1
->next
) {
1432 if (ufile1
->file
!=NULL
) {
1433 if (x
>=maxopenfiles
) {
1434 if (fclose(ufile1
->file
)==EOF
) {
1435 debuga(_("Failed to close the log file of user %s - %s\n"),ufile1
->user
->id
,strerror(errno
));
1444 if (snprintf (tmp3
, sizeof(tmp3
), "%s/%s.unsort", tmp
, ufile
->user
->filename
)>=sizeof(tmp3
)) {
1445 debuga(_("Temporary user file name too long: %s/%s.unsort\n"), tmp
, ufile
->user
->filename
);
1448 if ((ufile
->file
= MY_FOPEN (tmp3
, "a")) == NULL
) {
1449 debuga(_("(log) Cannot open temporary file: %s - %s\n"), tmp3
, strerror(errno
));
1454 /*if ( strcmp ( user , sz_Last_User ) != 0 ) {
1455 if ( fp_Write_User )
1456 fclose( fp_Write_User ) ;
1457 sprintf (tmp3, "%s/%s.unsort", tmp, user);
1459 if ((fp_Write_User = MY_FOPEN (tmp3, "a")) == NULL) {
1460 fprintf (stderr, "%s: (log) %s: %s - %s\n", argv[0], _("Cannot open temporary file"), tmp3, strerror(errno));
1463 strcpy( sz_Last_User , user ) ;
1465 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) {
1466 debuga(_("Write error in the log file of user %s\n"),user
);
1470 if(fp_log
&& ilf
!=ILF_Sarg
)
1471 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
);
1475 if(!dataonly
&& download_flag
&& download_url
&& strstr(code
,"DENIED") == 0) {
1478 if ( ! fp_Download_Unsort
) {
1479 if ((fp_Download_Unsort
= MY_FOPEN ( sz_Download_Unsort
, "a")) == NULL
) {
1480 debuga(_("(log) Cannot open temporary file: %s - %s\n"),sz_Download_Unsort
, strerror(errno
));
1484 fprintf(fp_Download_Unsort
,"%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,download_url
);
1487 if((ReportType
& REPORT_TYPE_DENIED
) != 0 || (ReportType
& REPORT_TYPE_AUTH_FAILURES
) != 0) {
1488 if(fp_denied
&& strstr(code
,"DENIED/403") != 0) {
1489 fprintf(fp_denied
, "%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,urly
);
1492 if(fp_authfail
&& (strstr(code
,"DENIED/401") != 0 || strstr(code
,"DENIED/407") != 0)) {
1493 fprintf(fp_authfail
, "%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,urly
);
1498 if (ilf
!=ILF_Sarg
) {
1499 if(!totper
|| idata
<mindate
){
1501 memcpy(&period
.start
,t
,sizeof(*t
));
1502 strcpy(start_hour
,tbuf2
);
1504 if (!totper
|| idata
>maxdate
) {
1506 memcpy(&period
.end
,t
,sizeof(*t
));
1512 printf("IP=\t%s\n",ip
);
1513 printf("USER=\t%s\n",user
);
1514 printf("ELAP=\t%s\n",elap
);
1515 printf("DATE=\t%s\n",dia
);
1516 printf("TIME=\t%s\n",hora
);
1517 printf("FUNC=\t%s\n",fun
);
1518 printf("URL=\t%s\n",url
);
1519 printf("CODE=\t%s\n",code
);
1520 printf("LEN=\t%s\n",tam
);
1528 if( ShowReadStatistics
)
1529 printf(_("SARG: Records in file: %lu, reading: %3.2f%%\n"),recs1
, (float) 100 );
1535 debuga(_(" Records read: %ld, written: %ld, excluded: %ld\n"),totregsl
,totregsg
,totregsx
);
1537 longline_destroy(&line
);
1538 if ( fp_Download_Unsort
)
1539 fclose (fp_Download_Unsort
);
1541 for (ufile
=first_user_file
; ufile
; ufile
=ufile1
) {
1543 if (ufile
->file
!=NULL
) fclose(ufile
->file
);
1548 free_excludecodes();
1554 for (ilf
=0 ; ilf
<ILF_Last
; ilf
++) totalcount
+=ilf_count
[ilf
];
1556 if(ilf_count
[ILF_Common
]>0 && ilf_count
[ILF_Squid
]>0)
1557 debuga(_("Log with mixed records format (squid and common log)\n"));
1559 if(ilf_count
[ILF_Common
]>0 && ilf_count
[ILF_Squid
]==0)
1560 debuga(_("Common log format\n"));
1562 if(ilf_count
[ILF_Common
]==0 && ilf_count
[ILF_Squid
]>0)
1563 debuga(_("Squid log format\n"));
1565 if(ilf_count
[ILF_Sarg
]>0)
1566 debuga(_("Sarg log format\n"));
1568 if(totalcount
==0 && totregsg
)
1569 debuga(_("Log with invalid format\n"));
1573 debuga(_("No records found\n"));
1575 if(fp_denied
) fclose(fp_denied
);
1576 if(fp_authfail
) fclose(fp_authfail
);
1578 if(userfile
) free(userfile
);
1583 if (date
[0]!='\0') {
1584 char date0
[30], date1
[30];
1586 strftime(date0
,sizeof(date0
),"%d/%m/%Y",&period
.start
);
1587 strftime(date1
,sizeof(date1
),"%d/%m/%Y",&period
.end
);
1588 debuga(_("Period covered by log files: %s-%s\n"),date0
,date1
);
1589 getperiod_fromrange(&period
,dfrom
,duntil
);
1591 if (getperiod_buildtext(&period
)<0) {
1592 debuga(_("Failed to build the string representation of the date range\n"));
1597 debugaz("data",dia
);
1598 debugaz("period",period
.text
);
1602 debuga(_("Period: %s\n"),period
.text
);
1608 fclose(fp_authfail
);
1610 if(fp_log
!= NULL
) {
1612 strcpy(end_hour
,tbuf2
);
1613 strftime(val2
,sizeof(val2
),"%d%m%Y",&period
.start
);
1614 strftime(val1
,sizeof(val1
),"%d%m%Y",&period
.end
);
1615 sprintf(val4
,"%s/sarg-%s_%s-%s_%s.log",ParsedOutputLog
,val2
,start_hour
,val1
,end_hour
);
1616 if (rename(arq_log
,val4
)) {
1617 debuga(_("failed to rename %s to %s - %s\n"),arq_log
,val4
,strerror(errno
));
1619 strcpy(arq_log
,val4
);
1621 if(strcmp(ParsedOutputLogCompress
,"nocompress") != 0 && ParsedOutputLogCompress
[0] != '\0') {
1623 No double quotes around ParsedOutputLogCompress because it may contain command line options. If double quotes are
1624 necessary around the command name, put them in the configuration file.
1626 sprintf(val1
,"%s \"%s\"",ParsedOutputLogCompress
,arq_log
);
1627 cstatus
=system(val1
);
1628 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
1629 debuga(_("command return status %d\n"),WEXITSTATUS(cstatus
));
1630 debuga(_("command: %s\n"),val1
);
1636 debuga(_("Sarg parsed log saved as %s\n"),arq_log
);
1639 if(DataFile
[0] == '\0' && (ReportType
& REPORT_TYPE_DENIED
) != 0) {
1640 sprintf(csort
,"sort -T \"%s\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"",tmp
,denied_sort
,denied_unsort
);
1641 cstatus
=system(csort
);
1642 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
1643 debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus
));
1644 debuga(_("sort command: %s\n"),csort
);
1647 unlink(denied_unsort
);
1650 sort_users_log(tmp
, debug
);
1652 if(DataFile
[0] != '\0')
1657 if((ReportType
& REPORT_TYPE_DENIED
) != 0)
1658 unlink(denied_sort
);
1660 if(strcmp(tmp
,"/tmp") != 0) {
1677 static void getusers(const char *pwdfile
, int debug
)
1686 debuga(_("Loading password file from %s\n"),pwdfile
);
1688 if ((fp_usr
= fopen(pwdfile
, "r")) == NULL
) {
1689 debuga(_("(getusers) Cannot open file %s - %s\n"),pwdfile
,strerror(errno
));
1693 if (fseek(fp_usr
, 0, SEEK_END
)==-1) {
1694 debuga(_("Failed to move till the end of the users file %s: %s\n"),pwdfile
,strerror(errno
));
1697 nreg
= ftell(fp_usr
);
1699 debuga(_("Cannot get the size of file %s\n"),pwdfile
);
1703 if (fseek(fp_usr
, 0, SEEK_SET
)==-1) {
1704 debuga(_("Failed to rewind the users file %s: %s\n"),pwdfile
,strerror(errno
));
1708 if((userfile
=(char *) malloc(nreg
))==NULL
){
1709 debuga(_("malloc error (%ld)\n"),nreg
);
1713 bzero(userfile
,nreg
);
1714 strcpy(userfile
,":");
1716 while(fgets(buf
,sizeof(buf
),fp_usr
)!=NULL
) {
1717 str
=strchr(buf
,':');
1719 debuga(_("You have an invalid user in your %s file\n"),pwdfile
);
1723 strcat(userfile
,buf
);