X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=repday.c;h=9a412609b0c2a3f6ce7c2519dd4a848158ec7ace;hb=507460aefaddc24a2e53a9f4a6399098c23dc7c5;hp=db4ec0c900e60e1e2597efacd83edfd1b4cceb5a;hpb=32e71fa45f370c385127c7abe74bef9ec110660d;p=thirdparty%2Fsarg.git diff --git a/repday.c b/repday.c index db4ec0c..9a41260 100644 --- a/repday.c +++ b/repday.c @@ -1,10 +1,11 @@ /* - * AUTHOR: Pedro Lineu Orso pedro.orso@gmail.com - * 1998, 2008 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net + * 1998, 2012 * * SARG donations: * please look at http://sarg.sourceforge.net/donations.php + * Support: + * http://sourceforge.net/projects/sarg/forums/forum/363374 * --------------------------------------------------------------------- * * This program is free software; you can redistribute it and/or modify @@ -24,200 +25,227 @@ */ #include "include/conf.h" +#include "include/defs.h" extern numlist hours; -void report_day(const char *user) +void report_day(const struct userinfostruct *uinfo) { - - FILE *fp_in, *fp_ou; - - char data[20]; - char odata[20]; - char hour[20]; - char elap[20]; - char oelap[20]; - char html[8000]; - char arqout[MAXLEN]; - char wdirname[MAXLEN]; - char wuser[255]; - char c[ 24 ][20]; - int count=0; - int ihour=0; - long long int v[ 24 ] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, - 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L }; - long long int t[ 24 ] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, - 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L }; - long long int tt=0, ttt=0; - int i; - - sprintf(arqout,"%s/%s/d%s.html",dirname,user,user); - sprintf(wdirname,"%s/%s.day",tmp,user); - - if(access(wdirname, R_OK) != 0) - return; - - if((fp_in=fopen(wdirname,"r"))==NULL) { - fprintf(stderr, "SARG: (repday) %s: %s\n",text[8],wdirname); - exit(1); - } - - if((fp_ou=fopen(arqout,"w"))==NULL) { - fprintf(stderr, "SARG: (repday) %s: %s\n",text[8],arqout); - exit(1); - } - - fprintf(fp_ou, "\n\n\n \n",CharSet); - css(fp_ou); - fputs("\n",fp_ou); - if(strlen(FontFace) > 0) fprintf(fp_ou,"\n",FontFace); - fprintf(fp_ou,"\n",BgColor,TxColor,BgImage); - if(strlen(LogoImage) > 0) fprintf(fp_ou, "
\n\n\n
 %s
\n",LogoImage,Width,Height,LogoText); - - if(strcmp(IndexTree,"date") == 0) - show_sarg(fp_ou, "../../../.."); - else - show_sarg(fp_ou, "../.."); - - fputs("
\n",fp_ou); - sprintf(html,"\n",Title); - fputs(html,fp_ou); - - fputs("
%s
\n",fp_ou); - fputs("
\n",fp_ou); - - sprintf(html,"\n",text[89],period); - fputs(html,fp_ou); - - strcpy(wuser,user); - if(strstr(wuser,"_") != 0) - fixip(wuser); - - if(strcmp(Ip2Name,"yes") == 0) - if((str=(char *) strstr(name, ".")) != (char *) NULL) { - if((str=(char *) strstr(str+1, ".")) != (char *) NULL) - ip2name(wuser,sizeof(wuser)); - } - - if(UserTabFile[0] != '\0') { - sprintf(warea,":%s:",wuser); - if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { - z1=0; - str2=(char *) strstr(str+1,":"); - str2++; - bzero(name, MAXLEN); - while(str2[z1] != ':') { - name[z1]=str2[z1]; - z1++; - } - } else strcpy(name,wuser); - } else strcpy(name,user); - - if(dotinuser && strstr(name,"_")) { - str2=(char *)subs(name,"_","."); - strcpy(name,str2); - } - - sprintf(html,"\n",text[90],name); - fputs(html,fp_ou); - - fputs("\n",fp_ou); - fputs("
%s: %s
%s: %s
\n",fp_ou); - - fputs("\n", fp_ou); - - fputs( "\n", fp_ou ); - - if(strcmp(datetimeby,"bytes") == 0) - strcpy( html, text[93] ); - else - strcpy( html, "H:M:S" ); - - for( i = 0; i < hours.len; i++ ) - fprintf( fp_ou, - "\n", hours.list[ i ], html ); - fprintf( fp_ou, - "\n", text[107], html ); - - while(fgets(buf,sizeof(buf),fp_in)!=NULL) { - if (getword(data,sizeof(data),buf,' ')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdirname); - exit(1); - } - if(!count) { - strcpy(odata,data); - count++; - } - - if (getword(hour,sizeof(hour),buf,' ')<0 || getword(elap,sizeof(elap),buf,' ')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdirname); - exit(1); - } - elap[strlen(elap)-1]='\0'; - - if(strcmp(data,odata) != 0) { - strcpy(oelap,elap); - - for( i = 0; i < hours.len; i++ ) - sprintf(c[ hours.list[ i ] ],"%s",fixtime(v[ hours.list[ i ] ])); - - for( i = 8; i <= 17; i++ ) - if(strcmp(c[ hours.list[ i ] ],"00:00:00") == 0) - bzero(c[ hours.list[ i ] ],12); - - fprintf( fp_ou, - "\n", odata ); - for( i = 0; i < hours.len; i++ ) - fprintf( fp_ou, - "\n", c[ hours.list[ i ] ] ); - fprintf( fp_ou, - "\n", fixtime(tt) ); - - tt=0; - for( i = 0; i < hours.len; i++ ) v[ hours.list[ i ] ]=0; - strcpy(odata,data); - strcpy(elap,oelap); - } - - ihour=atoi(hour); - - v[ ihour ]+=my_atoll(elap); - tt+=my_atoll(elap); - t[ ihour ]+=my_atoll(elap); - ttt+=my_atoll(elap); - - } - - for( i = 0; i < hours.len; i++ ) - sprintf(c[ hours.list[ i ] ],"%s",fixtime(v[ hours.list[ i ] ])); - - for( i = 0; i < hours.len; i++ ) - if(strcmp(c[ hours.list[ i ] ],"00:00:00") == 0) bzero(c[ hours.list[ i ] ],12); - - fprintf( fp_ou, - "\n", data ); - for( i = 0; i < hours.len; i++ ) - fprintf( fp_ou, - "\n", c[ hours.list[ i ] ] ); - fprintf( fp_ou, - "\n", fixtime(tt) ); - - for( i = 0; i < hours.len; i++ ) - sprintf(c[ hours.list[ i ] ],"%s",fixtime(t[ hours.list[ i ] ])); - - fprintf( fp_ou, - "\n", text[107] ); - for( i = 0; i < hours.len; i++ ) - fprintf( fp_ou, - "\n", c[ hours.list[ i ] ] ); - fprintf( fp_ou, - "\n", fixtime(ttt) ); - - fputs("\n\n",fp_ou); - - show_info(fp_ou); - - fclose(fp_in); - fclose(fp_ou); - return; + FILE *fp_in, *fp_ou; + + char buf[200]; + char data[20]; + long long int hour; + const char *label; + char arqout[MAXLEN]; + char wdirname[2048]; + char colsep; + int ihour=0; + int day,month,year; + int daylist[MAX_DATETIME_DAYS]; + int daysort[MAX_DATETIME_DAYS]; + int ndaylist; + int daynum; + int dayidx; + long long int bytes; + long long int elap; + long long int tbytes[MAX_DATETIME_DAYS*24]; + long long int telap[MAX_DATETIME_DAYS*24]; + long long int tt; + long long int tttime[24]; + int i, j; + struct getwordstruct gwarea; + struct tm t; + + snprintf(wdirname,sizeof(wdirname),"%s/%s.day",tmp,uinfo->filename); + if(access(wdirname, R_OK) != 0) return; + + if (snprintf(arqout,sizeof(arqout),"%s/%s/d%s.html",outdirname,uinfo->filename,uinfo->filename)>=sizeof(arqout)) { + debuga(_("Output file name too long: %s/%s/d%s.html\n"),outdirname,uinfo->filename,uinfo->filename); + exit(EXIT_FAILURE); + } + + if((fp_in=fopen(wdirname,"r"))==NULL) { + debuga(_("(repday) Cannot open log file %s: %s\n"),wdirname,strerror(errno)); + exit(EXIT_FAILURE); + } + + memset(tbytes,0,sizeof(tbytes)); + memset(telap,0,sizeof(telap)); + ndaylist=0; + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + fixendofline(buf); + getword_start(&gwarea,buf); + if (getword(data,sizeof(data),&gwarea,'\t')<0) { + debuga(_("Invalid date in file %s\n"),wdirname); + exit(EXIT_FAILURE); + } + if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue; + if (day<1 || day>31 || month<1 || month>12 || year>9999) continue; + daynum=(year*10000)+(month*100)+day; + for (dayidx=0 ; dayidx=ndaylist) { + if (dayidx>=sizeof(daylist)/sizeof(*daylist)) { + debuga(_("Too many different dates in %s\n"),wdirname); + exit(EXIT_FAILURE); + } + daylist[ndaylist++]=daynum; + } + + if (getword_atoll(&hour,&gwarea,'\t')<0) { + debuga(_("Invalid time in file %s\n"),wdirname); + exit(EXIT_FAILURE); + } + ihour=(int)hour; + i=dayidx*24+ihour; + + if ((datetimeby & DATETIME_BYTE)!=0) { + colsep=((datetimeby & DATETIME_ELAP)!=0) ? '\t' : '\0'; + if (getword_atoll(&bytes,&gwarea,colsep)<0) { + debuga(_("Invalid number of bytes in file %s\n"),wdirname); + exit(EXIT_FAILURE); + } + tbytes[i]+=bytes; + } + if ((datetimeby & DATETIME_ELAP)!=0) { + if (getword_atoll(&elap,&gwarea,'\0')<0) { + debuga(_("Invalid elapsed time in file %s\n"),wdirname); + exit(EXIT_FAILURE); + } + telap[i]+=elap; + } + } + fclose(fp_in); + + if((fp_ou=fopen(arqout,"w"))==NULL) { + debuga(_("(repday) Cannot open log file %s: %s\n"),arqout,strerror(errno)); + exit(EXIT_FAILURE); + } + + write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("Day report"),HTML_JS_NONE); + fprintf(fp_ou,"\n",_("Period"),period.html); + fprintf(fp_ou,"\n",_("User"),uinfo->label); + close_html_header(fp_ou); + + dayidx=0; + for (i=0 ; i0 && daynum\n", fp_ou); + fputs("",fp_ou); + for( i = 0; i < hours.len; i++ ) { + /* TRANSLATORS: It is an hour in the hourly report */ + sprintf(data,_("%02dH"),hours.list[ i ]); + fprintf(fp_ou, "\n", data, label ); + } + fprintf(fp_ou, "\n", _("TOTAL"), label ); + + memset(tttime,0,sizeof(tttime)); + for (dayidx=0 ; dayidx\n", data ); + tt=0; + for( i = 0; i < hours.len; i++ ) { + ihour=hours.list[i]; + if (tbytes[daynum*24+ihour]>0) { + fprintf(fp_ou, "\n",fixnum(tbytes[daynum*24+ihour],1)); + tt+=tbytes[daynum*24+ihour]; + tttime[ihour]+=tbytes[daynum*24+ihour]; + } else + fputs("\n",fp_ou); + } + fprintf(fp_ou, "\n",fixnum(tt,1)); + } + + fprintf(fp_ou, "\n", _("TOTAL") ); + tt=0; + for( i = 0; i < hours.len; i++ ) { + if (tttime[i]>0) { + fprintf(fp_ou, "\n",fixnum(tttime[i],1)); + tt+=tttime[i]; + } else + fputs("\n",fp_ou); + } + fprintf(fp_ou, "\n",fixnum(tt,1)); + fputs("
%02dH
%s
%s
%s
%s%s%s
%s%s%s
%s%s%s
%s: %s
%s: %s
%s
%s
%s
%s
%s%s%s
%s%s%s
\n",fp_ou); +#ifdef ENABLE_DOUBLE_CHECK_DATA + if (tt!=uinfo->nbytes) { + debuga(_("Total downloaded bytes is %"PRIi64" instead of %"PRIi64" in the hourly report of user %s\n"), + (int64_t)tt,(int64_t)uinfo->nbytes,uinfo->label); + exit(EXIT_FAILURE); + } +#endif + } + + if((datetimeby & DATETIME_ELAP)!=0) { + label=_("H:M:S"); + fputs("\n", fp_ou); + fputs("",fp_ou); + for( i = 0; i < hours.len; i++ ) { + sprintf(data,_("%02dH"),hours.list[ i ]); + fprintf(fp_ou, "\n", data, label ); + } + fprintf(fp_ou, "\n", _("TOTAL"), label ); + + memset(tttime,0,sizeof(tttime)); + for (dayidx=0 ; dayidx\n", data ); + tt=0; + for( i = 0; i < hours.len; i++ ) { + ihour=hours.list[i]; + if (telap[daynum*24+ihour]>0) { + fprintf(fp_ou, "\n",fixtime(telap[daynum*24+ihour])); + tt+=telap[daynum*24+ihour]; + tttime[ihour]+=telap[daynum*24+ihour]; + } else + fputs("\n",fp_ou); + } + fprintf(fp_ou, "\n",fixtime(tt)); + } + + fprintf(fp_ou, "\n", _("TOTAL") ); + tt=0; + for( i = 0; i < hours.len; i++ ) { + if (tttime[i]>0) { + fprintf(fp_ou, "\n",fixtime(tttime[i])); + tt+=tttime[i]; + } else + fputs("\n",fp_ou); + } + fprintf(fp_ou, "\n",fixtime(tt)); + fputs("
%s
%s
%s
%s
%s%s%s
%s%s%s
\n",fp_ou); +#ifdef ENABLE_DOUBLE_CHECK_DATA + if (tt!=uinfo->elap) { + debuga(_("Total elapsed time is %"PRIi64" instead of %"PRIi64" in the hourly report of user %s\n"), + (int64_t)tt,(int64_t)uinfo->elap,uinfo->label); + exit(EXIT_FAILURE); + } +#endif + } + + if (write_html_trailer(fp_ou)<0) + debuga(_("Write error in file %s\n"),arqout); + if (fclose(fp_ou)==EOF) { + debuga(_("Write error in %s: %s\n"),arqout,strerror(errno)); + exit(EXIT_FAILURE); + } + return; }