X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=useragent.c;h=1e654d392afdaf0494e60d3e2e62afdfebe524f5;hb=cedca1116b4193e322d94a8cf5373c8168d5ac5c;hp=9ec1cfc244c089995d1c4f9e7e7f1f0aeb428e58;hpb=00d1f9edfc63326a84d1968b5dbf8b321ecea357;p=thirdparty%2Fsarg.git diff --git a/useragent.c b/useragent.c index 9ec1cfc..1e654d3 100644 --- a/useragent.c +++ b/useragent.c @@ -26,10 +26,15 @@ #include "include/conf.h" #include "include/defs.h" +#include "include/filelist.h" + +FileListObject UserAgentLog=NULL; void useragent(void) { + FileObject *fp_log; FILE *fp_in = NULL, *fp_ou = NULL, *fp_ht = NULL; + char *ptr; char buf[MAXLEN]; char ip[MAXLEN], data[MAXLEN], agent[MAXLEN], user[MAXLEN]; char ipbefore[MAXLEN], namebefore[MAXLEN]; @@ -42,12 +47,15 @@ void useragent(void) char tmp3[MAXLEN]; char day[4],month[5],year[5], wdate[20]; char csort[MAXLEN]; + const char *FileName; int agentot=0, agentot2=0, agentdif=0, cont=0, nagent; unsigned long totregsl=0; int cstatus; int ndate; double perc; struct getwordstruct gwarea, gwarea1; + longline line; + FileListIterator FIter; ip[0]='\0'; data[0]='\0'; @@ -58,112 +66,126 @@ void useragent(void) ipbefore[0]='\0'; namebefore[0]='\0'; - sprintf(tmp3,"%s/squagent.int_unsort",tmp); - sprintf(tmp2,"%s/squagent.int_log",tmp); - - if((fp_in=fopen(UserAgentLog,"r"))==NULL) { - debuga(_("Cannot open file \"%s\": %s\n"),UserAgentLog,strerror(errno)); - exit(EXIT_FAILURE); - } + snprintf(tmp3,sizeof(tmp3),"%s/squagent.int_unsort",tmp); + snprintf(tmp2,sizeof(tmp2),"%s/squagent.int_log",tmp); if((fp_ou=fopen(tmp3,"w"))==NULL) { - debuga(_("Cannot open file \"%s\": %s\n"),tmp3,strerror(errno)); + debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp3,strerror(errno)); exit(EXIT_FAILURE); } - if(debug) { - debuga(_("Reading useragent log: %s\n"),UserAgentLog); + if ((line=longline_create())==NULL) { + debuga(__FILE__,__LINE__,_("Not enough memory to read useragent log\n")); + exit(EXIT_FAILURE); } - while(fgets(buf,sizeof(buf),fp_in)!=NULL) { - totregsl++; - getword_start(&gwarea,buf); - if (getword(ip,sizeof(ip),&gwarea,' ')<0 || getword_skip(MAXLEN,&gwarea,'[')<0 || - getword(data,sizeof(data),&gwarea,' ')<0) { - debuga(_("Invalid record in file \"%s\"\n"),UserAgentLog); - exit(EXIT_FAILURE); - } - getword_start(&gwarea1,data); - if (getword(day,sizeof(day),&gwarea1,'/')<0 || getword(month,sizeof(month),&gwarea1,'/')<0 || - getword(year,sizeof(year),&gwarea1,':')<0) { - debuga(_("Invalid date in file \"%s\"\n"),UserAgentLog); + FIter=FileListIter_Open(UserAgentLog); + while ((FileName=FileListIter_Next(FIter))!=NULL) + { + longline_reset(line); + if((fp_log=decomp(FileName))==NULL) { + debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),FileName,FileObject_GetLastOpenError()); exit(EXIT_FAILURE); } - buildymd(day,month,year,wdate,sizeof(wdate)); - ndate=atoi(wdate); - if (ndateduntil) break; - if(totregsl == 1) - strcpy(idate,data); - strcpy(fdate,data); - if (getword_skip(MAXLEN,&gwarea,'"')<0 || getword(agent,sizeof(agent),&gwarea,'"')<0) { - debuga(_("Invalid useragent in file \"%s\"\n"),UserAgentLog); - exit(EXIT_FAILURE); + + if(debug) { + debuga(__FILE__,__LINE__,_("Reading useragent log \"%s\"\n"),FileName); } - if(gwarea.current[0]!='\0') { - if (getword_skip(MAXLEN,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,'\n')<0) { - debuga(_("Invalid record in file \"%s\"\n"),UserAgentLog); + while((ptr=longline_read(fp_log,line))!=NULL) { + totregsl++; + getword_start(&gwarea,ptr); + if (getword(ip,sizeof(ip),&gwarea,' ')<0 || getword_skip(MAXLEN,&gwarea,'[')<0 || + getword(data,sizeof(data),&gwarea,' ')<0) { + debuga(__FILE__,__LINE__,_("Invalid record in file \"%s\"\n"),FileName); exit(EXIT_FAILURE); } - if(user[0] == '-') - strcpy(user,ip); - if(user[0] == '\0') + getword_start(&gwarea1,data); + if (getword(day,sizeof(day),&gwarea1,'/')<0 || getword(month,sizeof(month),&gwarea1,'/')<0 || + getword(year,sizeof(year),&gwarea1,':')<0) { + debuga(__FILE__,__LINE__,_("Invalid date in file \"%s\"\n"),FileName); + exit(EXIT_FAILURE); + } + if (dfrom!=0 || duntil!=0){ + buildymd(day,month,year,wdate,sizeof(wdate)); + ndate=atoi(wdate); + if (ndateduntil) break; + } + if(totregsl == 1) + strcpy(idate,data); + strcpy(fdate,data); + if (getword_skip(MAXLEN,&gwarea,'"')<0 || getword(agent,sizeof(agent),&gwarea,'"')<0) { + debuga(__FILE__,__LINE__,_("Invalid useragent in file \"%s\"\n"),FileName); + exit(EXIT_FAILURE); + } + + if(gwarea.current[0]!='\0') { + if (getword_skip(MAXLEN,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,'\n')<0) { + debuga(__FILE__,__LINE__,_("Invalid record in file \"%s\"\n"),FileName); + exit(EXIT_FAILURE); + } + if(user[0] == '-') + strcpy(user,ip); + if(user[0] == '\0') + strcpy(user,ip); + } else { strcpy(user,ip); - } else { - strcpy(user,ip); + } + + fprintf(fp_ou,"%s\t%s\t%s\n",ip,agent,user); + useragent_count++; } - fprintf(fp_ou,"%s\t%s\t%s\n",ip,agent,user); - useragent_count++; + if (FileObject_Close(fp_log)==EOF) { + debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),FileName,FileObject_GetLastCloseError()); + exit(EXIT_FAILURE); + } } + FileListIter_Close(FIter); + longline_destroy(&line); if(debug) { - debuga(_(" Records read: %ld\n"),totregsl); + debuga(__FILE__,__LINE__,_(" Records read: %ld\n"),totregsl); } if (fclose(fp_ou)==EOF) { - debuga(_("Write error in \"%s\": %s\n"),tmp3,strerror(errno)); - exit(EXIT_FAILURE); - } - if (fclose(fp_in)==EOF) { - debuga(_("Read error in \"%s\": %s\n"),UserAgentLog,strerror(errno)); + debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),tmp3,strerror(errno)); exit(EXIT_FAILURE); } - if(debug) { - debuga(_("Sorting file: %s\n"),tmp2); + debuga(__FILE__,__LINE__,_("Sorting file \"%s\"\n"),tmp2); } if (snprintf(csort,sizeof(csort),"sort -n -t \"\t\" -k 3,3 -k 2,2 -k 1,1 -o \"%s\" \"%s\"",tmp2,tmp3)>=sizeof(csort)) { - debuga(_("Sort command too long when sorting file \"%s\" to \"%s\"\n"),tmp2,tmp3); + debuga(__FILE__,__LINE__,_("Sort command too long when sorting file \"%s\" to \"%s\"\n"),tmp2,tmp3); exit(EXIT_FAILURE); } cstatus=system(csort); if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { - debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus)); - debuga(_("sort command: %s\n"),csort); + debuga(__FILE__,__LINE__,_("sort command return status %d\n"),WEXITSTATUS(cstatus)); + debuga(__FILE__,__LINE__,_("sort command: %s\n"),csort); exit(EXIT_FAILURE); } if((fp_in=fopen(tmp2,"r"))==NULL) { - debuga(_("Cannot open file \"%s\": %s\n"),tmp2,strerror(errno)); - debuga(_("sort command: %s\n"),csort); + debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp2,strerror(errno)); + debuga(__FILE__,__LINE__,_("sort command: %s\n"),csort); exit(EXIT_FAILURE); } if (!KeepTempLog && unlink(tmp3)) { - debuga(_("Cannot delete \"%s\": %s\n"),tmp3,strerror(errno)); + debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),tmp3,strerror(errno)); exit(EXIT_FAILURE); } snprintf(hfile,sizeof(hfile),"%s/useragent.html", outdirname); if((fp_ht=fopen(hfile,"w"))==NULL) { - debuga(_("Cannot open file \"%s\": %s\n"),hfile,strerror(errno)); + debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),hfile,strerror(errno)); exit(EXIT_FAILURE); } if(debug) - debuga(_("Making Useragent report\n")); + debuga(__FILE__,__LINE__,_("Making Useragent report\n")); write_html_header(fp_ht,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Squid Useragent's Report"),HTML_JS_NONE); fprintf(fp_ht,"%s\n",_("Squid Useragent's Report")); @@ -180,7 +202,7 @@ void useragent(void) while(fgets(buf,sizeof(buf),fp_in)!=NULL) { getword_start(&gwarea,buf); if (getword(ip,sizeof(ip),&gwarea,'\t')<0) { - debuga(_("Invalid IP address in file \"%s\"\n"),tmp2); + debuga(__FILE__,__LINE__,_("Invalid IP address in file \"%s\"\n"),tmp2); exit(EXIT_FAILURE); } @@ -193,11 +215,11 @@ void useragent(void) } if (getword(agent,sizeof(agent),&gwarea,'\t')<0) { - debuga(_("Invalid useragent in file \"%s\"\n"),tmp2); + debuga(__FILE__,__LINE__,_("Invalid useragent in file \"%s\"\n"),tmp2); exit(EXIT_FAILURE); } if (getword(user,sizeof(user),&gwarea,'\t')<0) { - debuga(_("Invalid user ID in file \"%s\"\n"),tmp2); + debuga(__FILE__,__LINE__,_("Invalid user ID in file \"%s\"\n"),tmp2); exit(EXIT_FAILURE); } @@ -217,33 +239,33 @@ void useragent(void) fputs("\n",fp_ht); if (fclose(fp_in)==EOF) { - debuga(_("Read error in \"%s\": %s\n"),tmp2,strerror(errno)); + debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),tmp2,strerror(errno)); exit(EXIT_FAILURE); } if (snprintf(csort,sizeof(csort),"sort -t \"\t\" -k 2,2 -o \"%s\" \"%s\"",tmp3,tmp2)>=sizeof(csort)) { - debuga(_("Sort command too long when sorting file \"%s\" to \"%s\"\n"),tmp2,tmp3); + debuga(__FILE__,__LINE__,_("Sort command too long when sorting file \"%s\" to \"%s\"\n"),tmp2,tmp3); exit(EXIT_FAILURE); } cstatus=system(csort); if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { - debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus)); - debuga(_("sort command: %s\n"),csort); + debuga(__FILE__,__LINE__,_("sort command return status %d\n"),WEXITSTATUS(cstatus)); + debuga(__FILE__,__LINE__,_("sort command: %s\n"),csort); exit(EXIT_FAILURE); } if((fp_in=fopen(tmp3,"r"))==NULL) { - debuga(_("Cannot open file \"%s\": %s\n"),tmp3,strerror(errno)); - debuga(_("sort command: %s\n"),csort); + debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp3,strerror(errno)); + debuga(__FILE__,__LINE__,_("sort command: %s\n"),csort); exit(EXIT_FAILURE); } if (!KeepTempLog && unlink(tmp2)) { - debuga(_("Cannot delete \"%s\": %s\n"),tmp2,strerror(errno)); + debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),tmp2,strerror(errno)); exit(EXIT_FAILURE); } if((fp_ou=fopen(tmp2,"w"))==NULL) { - debuga(_("Cannot open file \"%s\": %s\n"),tmp2,strerror(errno)); + debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp2,strerror(errno)); exit(EXIT_FAILURE); } @@ -253,11 +275,11 @@ void useragent(void) while(fgets(buf,sizeof(buf),fp_in)!=NULL) { getword_start(&gwarea,buf); if (getword(ip,sizeof(ip),&gwarea,'\t')<0) { - debuga(_("Invalid IP address in file \"%s\"\n"),tmp3); + debuga(__FILE__,__LINE__,_("Invalid IP address in file \"%s\"\n"),tmp3); exit(EXIT_FAILURE); } if (getword(agent,sizeof(agent),&gwarea,'\t')<0) { - debuga(_("Invalid useragent in file \"%s\"\n"),tmp3); + debuga(__FILE__,__LINE__,_("Invalid useragent in file \"%s\"\n"),tmp3); exit(EXIT_FAILURE); } @@ -280,37 +302,37 @@ void useragent(void) agentot2+=agentot; if (fclose(fp_ou)==EOF) { - debuga(_("Write error in \"%s\": %s\n"),tmp2,strerror(errno)); + debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),tmp2,strerror(errno)); exit(EXIT_FAILURE); } if (fclose(fp_in)==EOF) { - debuga(_("Read error in \"%s\": %s\n"),tmp3,strerror(errno)); + debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),tmp3,strerror(errno)); exit(EXIT_FAILURE); } if (!KeepTempLog && unlink(tmp3)) { - debuga(_("Cannot delete \"%s\": %s\n"),tmp3,strerror(errno)); + debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),tmp3,strerror(errno)); exit(EXIT_FAILURE); } if (snprintf(csort,sizeof(csort),"sort -n -r -k 1,1 -o \"%s\" \"%s\"",tmp3,tmp2)>=sizeof(csort)) { - debuga(_("Sort command too long when sorting file \"%s\" to \"%s\"\n"),tmp2,tmp3); + debuga(__FILE__,__LINE__,_("Sort command too long when sorting file \"%s\" to \"%s\"\n"),tmp2,tmp3); exit(EXIT_FAILURE); } cstatus=system(csort); if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { - debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus)); - debuga(_("sort command: %s\n"),csort); + debuga(__FILE__,__LINE__,_("sort command return status %d\n"),WEXITSTATUS(cstatus)); + debuga(__FILE__,__LINE__,_("sort command: %s\n"),csort); exit(EXIT_FAILURE); } if((fp_in=fopen(tmp3,"r"))==NULL) { - debuga(_("Cannot open file \"%s\": %s\n"),tmp3,strerror(errno)); - debuga(_("sort command: %s\n"),csort); + debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp3,strerror(errno)); + debuga(__FILE__,__LINE__,_("sort command: %s\n"),csort); exit(EXIT_FAILURE); } if (!KeepTempLog && unlink(tmp2)) { - debuga(_("Cannot delete \"%s\": %s\n"),tmp2,strerror(errno)); + debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),tmp2,strerror(errno)); exit(EXIT_FAILURE); } @@ -324,7 +346,7 @@ void useragent(void) fixendofline(buf); getword_start(&gwarea,buf); if (getword(tagent,sizeof(tagent),&gwarea,' ')<0) { - debuga(_("Invalid useragent in file \"%s\"\n"),tmp3); + debuga(__FILE__,__LINE__,_("Invalid useragent in file \"%s\"\n"),tmp3); exit(EXIT_FAILURE); } nagent=atoi(tagent); @@ -335,19 +357,19 @@ void useragent(void) fprintf(fp_ht,"%d%3.2lf\n",nagent,perc); } if (fclose(fp_in)==EOF) { - debuga(_("Read error in \"%s\": %s\n"),tmp3,strerror(errno)); + debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),tmp3,strerror(errno)); exit(EXIT_FAILURE); } fputs("\n",fp_ht); write_html_trailer(fp_ht); if (fclose(fp_ht)==EOF) { - debuga(_("Write error in \"%s\": %s\n"),hfile,strerror(errno)); + debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),hfile,strerror(errno)); exit(EXIT_FAILURE); } if (!KeepTempLog && unlink(tmp3)) { - debuga(_("Cannot delete \"%s\": %s\n"),tmp3,strerror(errno)); + debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),tmp3,strerror(errno)); exit(EXIT_FAILURE); }