From 491b862f532989fd9bc4edf2c093200b60d57919 Mon Sep 17 00:00:00 2001 From: Guido Serassio Date: Wed, 15 Feb 2006 18:01:05 +0000 Subject: [PATCH] Imported Sarg 2.1.0 --- ChangeLog | 35 +++ Makefile.in | 4 +- README | 2 + authfail.c | 7 +- css.c | 40 ++- css.tpl | 29 ++- dansguardian_log.c | 33 ++- dansguardian_report.c | 7 +- datafile.c | 7 +- denied.c | 9 +- download.c | 7 +- email.c | 2 +- getconf.c | 62 +++++ html.c | 29 ++- images/datetime.png | Bin 263 -> 199 bytes images/graph.png | Bin 130 -> 95 bytes images/sarg-squidguard-block.png | Bin 320 -> 291 bytes images/sarg.png | Bin 7943 -> 7153 bytes include/conf.h | 42 ++- include/info.h | 4 +- index.c | 432 +++++++++++++++++++++++-------- languages/Bulgarian_windows1251 | 7 + languages/Catalan | 7 + languages/Czech | 7 + languages/Dutch | 7 + languages/English | 7 + languages/French | 7 + languages/German | 7 + languages/Greek | 8 +- languages/Hungarian | 7 + languages/Indonesian | 7 + languages/Italian | 7 + languages/Japanese | 7 + languages/Latvian | 7 + languages/Polish | 7 + languages/Portuguese | 7 + languages/Romanian | 7 + languages/Russian_UTF-8 | 137 ++++++++++ languages/Russian_koi8 | 7 + languages/Russian_windows1251 | 7 + languages/Serbian | 7 + languages/Slovak | 7 + languages/Spanish | 7 + languages/Turkish | 7 + languages/Ukrainian_windows1251 | 7 + lastlog.c | 2 + log.c | 74 +++++- repday.c | 6 +- report.c | 23 +- sarg-php/sarg-realtime.php | 5 + sarg.conf | 113 +++++--- siteuser.c | 9 +- sort.c | 3 + squidguard_log.c | 293 ++++++++++++--------- squidguard_report.c | 5 +- topsites.c | 12 +- topuser.c | 32 ++- totger.c | 1 - usage.c | 2 +- useragent.c | 5 +- util.c | 196 ++++++++++++-- 61 files changed, 1414 insertions(+), 417 deletions(-) create mode 100755 languages/Russian_UTF-8 create mode 100755 sarg-php/sarg-realtime.php diff --git a/ChangeLog b/ChangeLog index 32ac15a..4107633 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,40 @@ SARG ChangeLog +Nov/29/2005 version 2.1 + - index_tree tag added. + Look at TAG: index_tree in sarg.conf file + default is file - old format. + - realtime report added. sarg -r option + Look at these tags ion sarg.conf file: + TAG: realtime_refresh_time num sec + TAG: realtime_access_log_lines num + TAG: realtime_types: GET,PUT,CONNECT,ICP_QUERY,POST + TAG: realtime_unauthenticated_records: ignore|show + - garbage in topuser report with unitialized variable. + Thanks to Craig Brockmeier + - memory leaks caused by a wrong variable size + Fixed by Klaus Singvogel . Thanks. + - ignoring users with '.' in password file. + Thanks to Emerson Valdir Pellis + - error with "resolve_ip" with "user_authentication yes" + Fixed by Grigory Trenin . Thanks. + - long url causing fault. + Thanks to Vassily Andin + - hanging on a log file containing space. + Thanks to Fabio Lo Votrico + - bug fixed in squidguard report module + - squidguard_ignore_date on|off tag added to sarg.conf file + You can ignore the squidguard log record date if outisde of + date range in squid access.log file. + - alternate squidguard log added using -L option on sarg command line. + Thanks to Dave Karlson + - fixed malloc withou free. + - datafile-url ip|name added to sarg.conf file - saves ip address or name + in url when using datafile tag. Thanks to Calvin Muller + - wronk link point in Generated by sarg-2.. + Thanks to Markus Hoffmann + - Russian_UFT-8 language added by Alex Deiter + Aug/04/2005 version 2.0.9 - dansguardian_report_limit missing in sarg.conf file. - ntlm domain+user format added. diff --git a/Makefile.in b/Makefile.in index fbed350..7ddebcb 100644 --- a/Makefile.in +++ b/Makefile.in @@ -24,14 +24,14 @@ SRCS = util.c log.c report.c topuser.c email.c sort.c html.c \ indexonly.c splitlog.c lastlog.c topsites.c siteuser.c css.c \ smartfilter.c denied.cauthfail.c language.c charset.c \ squidguard_log.c squidguard_report.c auth.c download.c grepday.c \ - dansguardian_log.c dansguardian_report.c + dansguardian_log.c dansguardian_report.c realtime.c OBJS = util.o log.o report.o topuser.o email.o sort.o html.o \ totger.o index.o getconf.o usage.o decomp.o ip2name.o \ useragent.o exclude.o convlog.o totday.o repday.o datafile.o \ indexonly.o splitlog.o lastlog.o topsites.o siteuser.o css.o \ smartfilter.o denied.o authfail.o language.o charset.o \ squidguard_log.o squidguard_report.o auth.o download.o grepday.o \ - dansguardian_log.o dansguardian_report.o + dansguardian_log.o dansguardian_report.o realtime.o DISTFILES = $(SRCS) diff --git a/README b/README index 6ca44b8..b1d9e0f 100644 --- a/README +++ b/README @@ -32,6 +32,8 @@ Antonis Maglaras - Greek language Dusan Woletz - Slovak Language Jose Luis Hernandez - Spanish language fix Theo kastermans - Dutch language fix +Alex Deiter - Russian UFT-8 language added + Translating . Copy include/English to YourLanguage diff --git a/authfail.c b/authfail.c index 84fc03d..d3b0c63 100644 --- a/authfail.c +++ b/authfail.c @@ -53,7 +53,7 @@ void authfail_report() ouser[0]='\0'; - sprintf(tmp4,"%s/authfail.log.unsort",TempDir); + sprintf(tmp4,"%s/sarg/authfail.log.unsort",TempDir); if(!authfail_count) { unlink(tmp4); @@ -111,7 +111,10 @@ void authfail_report() fputs("\n",fp_ou); } - show_sarg(fp_ou,".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_ou, "../../.."); + else + show_sarg(fp_ou,".."); fputs("
\n",fp_ou); sprintf(url,"\n",Title); fputs(url,fp_ou); diff --git a/css.c b/css.c index cfa8d76..cd7c3aa 100644 --- a/css.c +++ b/css.c @@ -44,57 +44,47 @@ int css(FILE *fp_css) } fputs("\n",fp_ou); - fflush(fp_ou); return; ;} diff --git a/css.tpl b/css.tpl index d6b6be7..2813bee 100644 --- a/css.tpl +++ b/css.tpl @@ -1,14 +1,19 @@ -.body {font-family:Verdana,Tahoma,Arial;color:#000000;background-color:#FFFFFF;} +.body {font-family:Verdana,Tahoma,Arial;color:#000000;background-color:#ffffff;} .info {font-family:Verdana,Tahoma,Arial;font-size:9px;} -.info a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000FF;font-size:9px;text-decoration:none;} -.title {font-family:Verdana,Tahoma,Arial;font-size:11px;color:darkblue;background-color:#FFFFFF;} -.header {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#DDDDDD;text-align:left;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} -.header2 {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#DDDDDD;text-align:right;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} -.header3 {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#DDDDDD;text-align:center;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} +.info a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000ff;font-size:9px;text-decoration:none;} +.title {font-family:Verdana,Tahoma,Arial;font-size:11px;color:darkblue;background-color:#ffffff;} +.title2 {font-family:Verdana,Tahoma,Arial;font-size:11px;color:darkblue;background-color:#ffffff;text-align:left;} +.title3 {font-family:Verdana,Tahoma,Arial;font-size:11px;color:darkblue;background-color:#ffffff;text-align:right;} +.header {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#dddddd;text-align:left;border-right:1px solid #666666;border-bottom:1px solid #666666;} +.header2 {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#dddddd;text-align:right;border-right:1px solid #666666;border-bottom:1px solid #666666;} +.header3 {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#dddddd;text-align:center;border-right:1px solid #666666;border-bottom:1px solid #666666;} .text {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;} -.data {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;background-color:lavender;text-align:right;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} -.data a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000FF;font-size:9px;background-color:lavender;text-align:right;text-decoration:none;} -.data2 {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;background-color:lavender;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} -.data2 a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000FF;font-size:9px;background-color:lavender;text-decoration:none;} -.link {font-family:Verdana,Tahoma,Arial;font-size:9px;color:#0000FF;} -.link a:link,a:visited {font-family:Verdana,Tahoma,Arial;font-size:9px;color:#0000FF;text-decoration:none;} +.data {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;background-color:lavender;text-align:right;border-right:1px solid #6a5acd;border-bottom:1px solid #6a5acd;} +.data a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000ff;font-size:9px;background-color:lavender;text-align:right;text-decoration:none;} +.data2 {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;background-color:lavender;border-right:1px solid #6a5acd;border-bottom:1px solid #6a5acd;} +.data2 a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000ff;font-size:9px;background-color:lavender;text-decoration:none;} +.data3 {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px,text-align:center;background-color:lavender;border-right:1px solid #6a5acd;border-bottom:1px solid #6a5acd;} +.data3 a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000ff;font-size:9px;text-align:center;background-color:lavender;text-decoration:none;} +.text {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;text-align:right;} +.link {font-family:Verdana,Tahoma,Arial;font-size:9px;color:#0000ff;} +.link a:link,a:visited {font-family:Verdana,Tahoma,Arial;font-size:9px;color:#0000ff;text-decoration:none;} diff --git a/dansguardian_log.c b/dansguardian_log.c index d999a5c..920e464 100644 --- a/dansguardian_log.c +++ b/dansguardian_log.c @@ -40,9 +40,6 @@ int dansguardian_log() int idata=0; int x, y; - if(strlen(DansGuardianConf) < 1) - return; - bzero(day, 3); bzero(mon, 4); bzero(year, 5); @@ -137,17 +134,29 @@ int dansguardian_log() sprintf(wdata,"%s%02d%s",year,atoi(mon),day); idata = atoi(wdata); - if(idata >= dfrom && idata <= duntil) { - if(strcmp(user,"-") == 0) - strcpy(user,ip); - sprintf(tmp6,"%s %d %s %s %s %s %s\n",user,idata,hour,ip,url,code1,code2); - fputs(tmp6, fp_ou); - dansguardian_count++; + if(strcmp(DansguardianIgnoreDate,"on") == 0) { + if(idata < dfrom && idata > duntil) + continue; + } + + if (strcmp(user,"-") == 0) { + strcpy(user,ip); + bzero(ip, 30); } + sprintf(tmp6,"%s %d %s %s %s %s %s\n",user,idata,hour,ip,url,code1,code2); + fputs(tmp6, fp_ou); + dansguardian_count++; } - fclose(fp_in); - fclose(fp_guard); - fclose(fp_ou); + + if(fp_in) fclose(fp_in); + if(fp_guard) fclose(fp_guard); + if(fp_ou) fclose(fp_ou); + + if(debug) { + sprintf(msg,"%s: %s",text[54],guard_ou); + debuga(msg); + } + sprintf(tmp6,"sort -k 1,1 -k 2,2 -k 4,4 '%s' -o '%s'",guard_in, guard_ou); system(tmp6); unlink(guard_in); diff --git a/dansguardian_report.c b/dansguardian_report.c index fd6b0c9..3c1b18d 100644 --- a/dansguardian_report.c +++ b/dansguardian_report.c @@ -105,7 +105,10 @@ void dansguardian_report() fputs("
%s
\n",fp_ou); } - show_sarg(fp_ou,".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_ou, "../../.."); + else + show_sarg(fp_ou,".."); fputs("
\n",fp_ou); sprintf(url,"\n",Title); fputs(url,fp_ou); @@ -200,7 +203,7 @@ void dansguardian_report() continue; } - sprintf(html2,"\n",name,ip,date,hour,url,url,rule); + sprintf(html2,"\n",name,ip,date,hour,url,url,rule); fputs(html2,fp_ou); } diff --git a/datafile.c b/datafile.c index d28ef48..cf77392 100644 --- a/datafile.c +++ b/datafile.c @@ -115,7 +115,7 @@ void data_file(char *tmp) strcpy(wdirname,dirname); gravatmp(oldaccuser,wdirname,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache); strcpy(wdirname,dirname); - saverecs(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache); + saverecs2(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache); nacc=0; nbytes=0; nelap=0; @@ -156,7 +156,7 @@ void data_file(char *tmp) return; } -void saverecs(char *dirname, char *user, long long int nacc, char *url, long long int nbytes, char *ip, char *hora, char *dia, long long int nelap, long long int incache, long long int oucache) +void saverecs2(char *dirname, char *user, long long int nacc, char *url, long long int nbytes, char *ip, char *hora, char *dia, long long int nelap, long long int incache, long long int oucache) { FILE *fp_ou; @@ -187,7 +187,8 @@ void saverecs(char *dirname, char *user, long long int nacc, char *url, long lon } if(strstr(DataFileFields,"url") != 0) { strcpy(name,url); - name2ip(name); + if (strcmp(DataFileUrl,"ip") == 0) + name2ip(name); strncat(reg,name,strlen(name)); strncat(reg,DataFileDelimiter,1); } diff --git a/denied.c b/denied.c index 9de8376..b0fbafd 100644 --- a/denied.c +++ b/denied.c @@ -52,7 +52,7 @@ void gen_denied_report() ouser[0]='\0'; - sprintf(denied_in,"%s/denied.log",TempDir); + sprintf(denied_in,"%s/sarg/denied.log",TempDir); if(!denied_count) { unlink(denied_in); return; @@ -101,7 +101,10 @@ void gen_denied_report() fputs("
%s
%s%s%s-%s%s%s
%s%s%s-%s%s%s
\n",fp_ou); } - show_sarg(fp_ou, ".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_ou, "../../.."); + else + show_sarg(fp_ou, ".."); sprintf(url,"%s\n",Title); fputs(url,fp_ou); @@ -179,7 +182,7 @@ void gen_denied_report() } if(strlen(BlockIt) > 0) - sprintf(BlockImage," ",wwwDocumentRoot,BlockIt,url); + sprintf(BlockImage," ",wwwDocumentRoot,BlockIt,url,ImageFile); else BlockImage[0]='\0'; sprintf(html2,"%s%s%s-%s%s%s\n",name,ip,data,hora,BlockImage,url,url); diff --git a/download.c b/download.c index 47861c6..0610ccc 100644 --- a/download.c +++ b/download.c @@ -99,7 +99,10 @@ void download_report() fputs("\n",fp_ou); } - show_sarg(fp_ou, ".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_ou, "../../.."); + else + show_sarg(fp_ou, ".."); sprintf(url,"%s\n",Title); fputs(url,fp_ou); @@ -177,7 +180,7 @@ void download_report() } if(strlen(BlockIt) > 0) - sprintf(BlockImage," ",wwwDocumentRoot,BlockIt,url); + sprintf(BlockImage," ",wwwDocumentRoot,BlockIt,url,ImageFile); else BlockImage[0]='\0'; sprintf(html2,"%s%s%s-%s%s%s\n",name,ip,data,hora,BlockImage,url,url); diff --git a/email.c b/email.c index 7ec5360..98f3e85 100644 --- a/email.c +++ b/email.c @@ -52,7 +52,7 @@ int geramail(const char *dirname, int debug, const char *outdir, int userip, cha strcat(top1,"/top"); strcat(top2,"/top.tmp"); strcat(top3,"/report"); - strcat(tusr,"/usuarios"); + strcat(tusr,"/users"); if((fp_in=fopen(wger,"r"))==NULL) { fprintf(stderr, "SARG: (email) %s: %s\n",text[45],wger); diff --git a/getconf.c b/getconf.c index ac953d5..140da75 100644 --- a/getconf.c +++ b/getconf.c @@ -364,6 +364,13 @@ int parmtest(char *buf) return; } + if(strstr(buf,"index_tree") != 0) { + getword(wbuf,buf,' '); + strcpy(IndexTree,buf); + fixnone(IndexTree); + return; + } + if(strstr(buf,"index") != 0) { if(strstr(buf,"index_sort_order") == 0) { getword(wbuf,buf,' '); @@ -586,6 +593,13 @@ int parmtest(char *buf) return; } + if(strstr(buf,"datafile_url") != 0) { + getword(wbuf,buf,' '); + strcpy(DataFileUrl,buf); + fixnone(DataFileUrl); + return; + } + if(strstr(buf,"parsed_output_log") != 0) { if(strstr(buf,"parsed_output_log_compress") == 0) { getword(wbuf,buf,' '); @@ -735,6 +749,20 @@ int parmtest(char *buf) return; } + if(strstr(buf,"squidguard_ignore_date") != 0) { + getword(wbuf,buf,' '); + strcpy(SquidguardIgnoreDate,buf); + fixnone(SquidguardIgnoreDate); + return; + } + + if(strstr(buf,"dansguardian_ignore_date") != 0) { + getword(wbuf,buf,' '); + strcpy(DansguardianIgnoreDate,buf); + fixnone(DansguardianIgnoreDate); + return; + } + if(strstr(buf,"ulimit") != 0) { getword(wbuf,buf,' '); strcpy(Ulimit,buf); @@ -748,6 +776,40 @@ int parmtest(char *buf) fixnone(NtlmUserFormat); return; } + + if(strstr(buf,"realtime_types") != 0) { + getword(wbuf,buf,' '); + strcpy(RealtimeTypes,buf); + fixnone(RealtimeTypes); + return; + } + + if(strstr(buf,"realtime_unauthenticated_records") != 0) { + getword(wbuf,buf,' '); + strcpy(RealtimeUnauthRec,buf); + fixnone(RealtimeUnauthRec); + return; + } + + if(strstr(buf,"realtime_refresh_time") != 0) { + getword(wbuf,buf,' '); + realtime_refresh=atoi(buf); + return; + } + + if(strstr(buf,"realtime_access_log_lines") != 0) { + getword(wbuf,buf,' '); + realtime_access_log_lines=atoi(buf); + return; + } + + if(strstr(buf,"byte_cost") != 0) { + getword(wbuf,buf,' '); + cost=atol(buf); + getword(wbuf,buf,' '); + nocost=my_atoll(buf); + return; + } return; } diff --git a/html.c b/html.c index 8da970e..de74596 100644 --- a/html.c +++ b/html.c @@ -35,7 +35,7 @@ void htmlrel() long long int totelap=0, totelap2=0, nnelap=0, unelap=0, tnelap=0; long long int incache=0, oucache=0, tnincache=0, tnoucache=0, twork=0, twork2=0; char arqin[MAXLEN], arqou[MAXLEN], arqper[MAXLEN], arqip[MAXLEN]; - char nacc[20], nbytes[20], url[1024], purl[1024], tmsg[30], tmsg2[30], nelap[20], csort[MAXLEN]; + char nacc[20], nbytes[20], url[1024], purl[1024], tmsg[50], tmsg2[50], nelap[20], csort[MAXLEN]; char periodo[MAXLEN], usuario[MAXLEN], wusuario[MAXLEN], u2[MAXLEN], duser[MAXLEN]; char userbytes[20], userelap[20], userurl[1024], userhora[9], userdia[9]; char user_ip[MAXLEN], olduserip[MAXLEN], tmp2[MAXLEN], tmp3[MAXLEN], incac[20], oucac[20]; @@ -195,7 +195,11 @@ void htmlrel() fputs("\n",fp_ou); } - show_sarg(fp_ou,"../.."); + 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); @@ -348,8 +352,11 @@ void htmlrel() sprintf(httplink,"%s", \ PrivacyStringColor,PrivacyString,PrivacyString); else + strcpy(tmp6,"../../images"); + if(strcmp(IndexTree,"date") == 0) + sprintf(tmp6,"../%s",ImageFile); if(strlen(BlockIt) > 0) - sprintf(httplink," %s",wwwDocumentRoot,BlockIt,urly,urly,urly); + sprintf(httplink," %s",wwwDocumentRoot,BlockIt,urly,tmp6,urly,urly); else sprintf(httplink,"%s",urly,urly,url); @@ -365,7 +372,7 @@ void htmlrel() if(str[z1]=='?' || str[z1]=='-' || str[z1]=='.' || str[z1]==':' || str[z1]=='/' || str[z1]=='\\') str[z1]='_'; } - sprintf(href2,"",usuario,siteind,ltext110,text[55]); + sprintf(href2,"",usuario,siteind,tmp6,ltext110,text[55]); } else { bzero(href2, MAXLEN); bzero(ltext110, 50); @@ -605,10 +612,10 @@ void htmlrel() fprintf(stderr, "SARG: (html9) %s: %s\n",text[45],PerUserLimitFile); exit(1); } - while(fgets(tmp5,sizeof(tmp5),fp_usr)!=NULL) { - if(strstr(tmp5,"\n") != 0) - tmp5[strlen(tmp5)-1]='\0'; - if(strcmp(tmp5,u2) == 0) { + while(fgets(tmp6,sizeof(tmp6),fp_usr)!=NULL) { + if(strstr(tmp6,"\n") != 0) + tmp6[strlen(tmp6)-1]='\0'; + if(strcmp(tmp6,u2) == 0) { limit_flag=1; break; } @@ -634,8 +641,8 @@ void htmlrel() } strcpy(arqper,dirname); - strcat(arqper,"/usuarios"); - + strcat(arqper,"/users"); + if ((fp_in = fopen(arqper, "r")) == 0){ fprintf(stderr, "SARG: (html11) %s: %s\n",text[45],arqper); exit(1); @@ -714,7 +721,7 @@ void htmlrel() fclose(fp_ou); - htaccess(name); + htaccess(wusuario); } diff --git a/images/datetime.png b/images/datetime.png index 61543da044611cf5d7c79faeba77c7c37c57c83c..83548c7fd0fb2bfcf289dedc32051c6e520a3a41 100644 GIT binary patch delta 171 zc-jH0095~n0>=T6B!7-cL_t(2kz+70F!+xPGcq!U{{R1<0fresg4h6l#S9E6G)anO zWo3a(hJ8Rh7pN%&r($gGXJTS9!Ekd*RMdZ%7>xe<^(&aofNp}ix;lnp7@L8anOO_u zE+l*dSurw(`xJ(OU?#TU#Htu*lRivwXJ_aC&!0d4U$bTnb|l3hEFmFb4|6*V^YQU< Z0RUp%7et)eIClU5002ovPDHLkV1hOaN6i2L delta 235 zc-jH$02Ken0fz#RB!A9HL_t&-m35FY4uUWghX1xK;K0y{6F9g$1}6u@9gG8`adGw* z9KgiE6BzE`4G3Z925b-}crKQ-fM3$Q*Y{r9uN6eZ_(NHi=W!h0X72$&Q51{8IF1)J zIb}k)aRvFW(KHR1`6h&TNhwd0#+riG8d~cFKmy>Rl-h%c*ktCKrfg~^c3sCr#NPZd zec!|Pednei2mkiYXGfIo!P)a>ao@E)@wnd)j008kj l%^`}SV;F`X+r6&q%@?~nZMgJ0r)mHI002ovPDHLkV1lx>YGVKZ diff --git a/images/graph.png b/images/graph.png index 3fc5ecf424a2ca9091230396fb460b556053c10e..1ff4728ae9fa4c732c7aa8f2827c732156b552e5 100644 GIT binary patch delta 65 zc-m`XjGv%lt>)?C7@{#TIbi|EpY}s+3d=kU1D@D(m>W2#zFhIcKE(6z|HSnY44;2D UcV6wxe#-y^p00i_>zopr068!k00000 delta 100 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 nv#arQn702P$ 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[0]) && !isdigit(direntp->d_name[1])) + continue; + if(strlen(direntp->d_name) > 4) { + bzero(y1,5); + bzero(y2,5); + bzero(m1,4); + bzero(m2,4); + bzero(d1,3); + bzero(d2,3); + if(strcmp(df,"u") == 0) { + strncpy(y1,direntp->d_name,4); + strncpy(m1,direntp->d_name+4,3); + strncpy(d1,direntp->d_name+7,2); + strncpy(y2,direntp->d_name+10,4); + strncpy(m2,direntp->d_name+14,3); + strncpy(d2,direntp->d_name+17,2); + } else if(strcmp(df,"e") == 0) { + strncpy(y1,direntp->d_name+5,4); + strncpy(m1,direntp->d_name+2,3); + strncpy(d1,direntp->d_name,2); + strncpy(y2,direntp->d_name+15,4); + strncpy(m2,direntp->d_name+12,3); + strncpy(d2,direntp->d_name+10,2); + } + conv_month(m1); + conv_month(m2); + } + sprintf(val1,"%s%s",outdir,y1); + if(access(val1, R_OK) != 0) + mkdir(val1,0755); + if(strcmp(m1,m2) != 0) + sprintf(val2,"%s/%s-%s",val1,m1,m2); + else + sprintf(val2,"%s/%s",val1,m1); + if(access(val2, R_OK) != 0) + mkdir(val2,0755); + if(strcmp(d1,d2) != 0) + sprintf(val3,"%s/%s-%s",val2,d1,d2); + else + sprintf(val3,"%s/%s",val2,d1); + sprintf(val4,"%s%s",outdir,direntp->d_name); + rename(val4,val3); + sprintf(val5,"%s/images",val2); + if(access(val5, R_OK) != 0) { + sprintf(val5,"ln -s %simages %s/images",outdir,val2); + system(val5); + } + } else { + if(!isdigit(direntp->d_name[0]) && !isdigit(direntp->d_name[1])) + continue; + if(strlen(direntp->d_name) == 4) { + strcpy(y1,direntp->d_name); + sprintf(val1,"%s%s",outdir,direntp->d_name); + dirp2 = opendir(val1); + while ((direntp2 = readdir( dirp2 )) != NULL) { + if(!isdigit(direntp2->d_name[0]) && !isdigit(direntp2->d_name[1])) + continue; + sprintf(val2,"%s/%s",val1,direntp2->d_name); + dirp3 = opendir(val2); + while ((direntp3 = readdir( dirp3 )) != NULL) { + if(!isdigit(direntp3->d_name[0]) && !isdigit(direntp3->d_name[1])) + continue; + bzero(newname,512); + strcpy(warea,direntp2->d_name); + if(strstr(warea,"-") != 0) { + getword(m1,warea,'-'); + strcpy(m2,warea); + conv_month_name(m1); + conv_month_name(m2); + } else { + strcpy(m1,warea); + conv_month_name(m1); + strcpy(m2,m1); + } + strcpy(warea,direntp3->d_name); + if(strstr(warea,"-") != 0) { + getword(d1,warea,'-'); + strcpy(d2,warea); + } else { + strcpy(d1,warea); + strcpy(d2,warea); + } + if(strcmp(df,"u") == 0) + sprintf(val4,"%s%s%s%s-%s%s%s",outdir,y1,m1,d1,y1,m2,d2); + else if(strcmp(df,"e") == 0) + sprintf(val4,"%s%s%s%s-%s%s%s",outdir,d1,m1,y1,d2,m2,y1); + sprintf(val5,"%s%s/%s/%s",outdir,y1,direntp2->d_name,direntp3->d_name); + if(rename(val5,val4)) { + fprintf(stderr, "SARG: (index) rename error - %s\n",strerror(errno)); + exit(1); + } + } + (void)rewinddir( dirp3 ); + (void)closedir( dirp3 ); + } + (void)rewinddir( dirp2 ); + (void)closedir( dirp2 ); + } +// sprintf(cmd,"rm -rf %s%s\n",outdir,direntp->d_name); +// system(cmd); + } } + (void)rewinddir( dirp ); + (void)closedir( dirp ); if((fp_tmp=fopen(wdir_tmp,"w"))==NULL) { fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp); @@ -74,111 +181,224 @@ void geraindex() } dirp = opendir(outdir); - while ( (direntp = readdir( dirp )) != NULL ){ - if(strstr(direntp->d_name,"-") == 0) + while ((direntp = readdir( dirp )) != NULL) { + if(strcmp(IndexTree,"date") == 0) { + if(strlen(direntp->d_name) > 4 || !isdigit(direntp->d_name[0]) && !isdigit(direntp->d_name[1])) + continue; + sprintf(warea,"%s %s\n",direntp->d_name,get_size(outdir,direntp->d_name)); + fputs(warea, fp_tmp); continue; - - bzero(newname, 512); - strncat(newname,direntp->d_name,4); - strncpy(month,direntp->d_name+4,3); - month[3]='\0'; - conv_month(month); - strcat(newname,month); - strncat(newname,direntp->d_name+7,2); - - obtdate(outdir,direntp->d_name,data); - obtuser(outdir,direntp->d_name,tuser); - obttotal(outdir,direntp->d_name,tbytes,tuser,media); - - strcpy(html,data); - getword(mon,html,' '); - getword(mon,html,' '); - getword(day,html,' '); - getword(hour,html,' '); - getword(year,html,' '); - getword(year,html,' '); - strcpy(html,hour); - getword(h,html,':'); - getword(m,html,':'); - strcpy(s,html); - buildymd(day,mon,year,ftime); - - sprintf(html,"%s%s%s%s;%s;%s;%s;%s;%s;%s\n",ftime, h, m, s, direntp->d_name, data, tuser, tbytes, media, - newname); - fputs(html, fp_tmp); - } - - fclose(fp_tmp); - (void)rewinddir( dirp ); - (void)closedir( dirp ); - - if(strcmp(IndexSortOrder,"A") == 0) -// sprintf(html,"sort -t';' -k 7,7 %s -o %s", wdir_tmp, wdir_tmp2); - sprintf(html,"sort -t';' +6.5n +6.2M +6.0n '%s' -o '%s'", wdir_tmp, wdir_tmp2); - else -// sprintf(html,"sort -t';' -r -k 7,7 %s -o %s", wdir_tmp, wdir_tmp2); - sprintf(html,"sort -t';' +6.5nr +6.2Mr +6.0nr '%s' -o '%s'", wdir_tmp, wdir_tmp2); - - system(html); - - unlink(wdir_tmp); - - fputs("\n",fp_ou); - fputs("\n",fp_ou); - fputs("\n",fp_ou); - sprintf(html," \n",CharSet); - fputs(html,fp_ou); - fputs("\n",fp_ou); - css(fp_ou); - - sprintf(buf,"\n",FontFace,TitleFontSize,BgColor,BgImage); - fputs(buf,fp_ou); - - sprintf(buf,"
%s
\n"); - fputs(buf,fp_ou); - - if(strlen(LogoImage) > 0) { - fputs("
\n",fp_ou); - sprintf(html,"\n",LogoImage,Width,Height,LogoText); - fputs(html,fp_ou); - fputs("\n",fp_ou); - fputs("
 %s
\n",fp_ou); + } else { + if(strstr(direntp->d_name,"-") == 0) + continue; + bzero(newname, 512); + if(strcmp(df,"u") == 0) { + strncat(newname,direntp->d_name,4); + strncpy(month,direntp->d_name+4,3); + } else { + strncat(newname,direntp->d_name+5,4); + strncpy(month,direntp->d_name+2,3); + } + month[3]='\0'; + conv_month(month); + strcat(newname,month); + if(strcmp(df,"u") == 0) + strncat(newname,direntp->d_name+7,2); + else + strncat(newname,direntp->d_name,2); + obtdate(outdir,direntp->d_name,data); + obtuser(outdir,direntp->d_name,tuser); + obttotal(outdir,direntp->d_name,tbytes,tuser,media); + strcpy(html,data); + getword(mon,html,' '); + getword(mon,html,' '); + getword(day,html,' '); + getword(hour,html,' '); + getword(year,html,' '); + getword(year,html,' '); + strcpy(html,hour); + getword(h,html,':'); + getword(m,html,':'); + strcpy(s,html); + buildymd(day,mon,year,ftime); + sprintf(warea,"%s%s%s%s;%s;%s;%s;%s;%s;%s\n",ftime, h, m, s, direntp->d_name, data, tuser, tbytes, media,newname); + fputs(warea, fp_tmp); + continue; + } } - show_sarg(fp_ou, "."); - sprintf(html,"%s\n",Title); - fputs(html,fp_ou); - fputs("
\n",fp_ou); - - fputs("
\n",fp_ou); - fputs("\n",fp_ou); - - sprintf(html,"\n", \ - hbc1,text[101],hbc1,text[102],hbc1,text[103],hbc1,text[93],hbc1,text[96]); - fputs(html,fp_ou); - - if((fp_tmp=fopen(wdir_tmp2,"r"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp2); - exit(1); + if(fp_tmp) fclose(fp_tmp); + if(strcmp(IndexTree,"file") == 0) { + (void)rewinddir( dirp ); + (void)closedir( dirp ); } - while(fgets(buf,MAXLEN,fp_tmp)!=NULL) { - getword(period,buf,';'); - getword(period,buf,';'); - getword(data,buf,';'); - getword(tuser,buf,';'); - getword(tbytes,buf,';'); - getword(media,buf,';'); - - sprintf(html," \ - \n", \ - period,ReplaceIndex,period,data,tuser,tbytes,media); + if(strcmp(IndexTree,"date") == 0) { + if(strcmp(IndexSortOrder,"A") == 0) + sprintf(warea,"sort -k 1,1 '%s' -o '%s'", wdir_tmp, wdir_tmp2); + else + sprintf(warea,"sort -r -k 1,1 '%s' -o '%s'", wdir_tmp, wdir_tmp2); + system(warea); + unlink(wdir_tmp); + if((fp_tmp=fopen(wdir_tmp2,"r"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp2); + exit(1); + } + if((fp_ou=fopen(wdir,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir); + exit(1); + } + write_html_header(fp_ou, "."); + sprintf(html,"\n",hbc1,text[130],hbc1,text[132]); fputs(html,fp_ou); + while(fgets(wwork1,MAXLEN,fp_tmp)!=NULL) { + getword(tmp4,wwork1,' '); + sprintf(html,"\n",tmp4,tmp4,wwork1); + fputs(html,fp_ou); + sprintf(tmp2,"%s%s",outdir,tmp4); + sprintf(tmp3,"%s%s/index.unsort",outdir,tmp4); + // Year dir + if((fp_ou2=fopen(tmp3,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],tmp3); + exit(1); + } + dirp2 = opendir(tmp2); + while ((direntp2 = readdir( dirp2 )) != NULL) { + if(!isdigit(direntp2->d_name[0]) && !isdigit(direntp2->d_name[1])) + continue; + sprintf(warea,"%s\n",direntp2->d_name); + fputs(warea,fp_ou2); + } + if(fp_ou2) fclose(fp_ou2); + (void)rewinddir(dirp2); + (void)closedir(dirp2); + sprintf(wdir_tmp3,"%s%s/index.sort",outdir,tmp4); + if(strcmp(IndexSortOrder,"A") == 0) + sprintf(csort,"sort -n '%s' -o '%s'", tmp3, wdir_tmp3); + else + sprintf(csort,"sort -n -r '%s' -o '%s'", tmp3, wdir_tmp3); + system(csort); + unlink(tmp3); + if((fp_tmp2=fopen(wdir_tmp3,"r"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp3); + exit(1); + } + sprintf(tmp3,"%s%s/index.html",outdir,tmp4); + if((fp_ou2=fopen(tmp3,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir); + exit(1); + } + write_html_header(fp_ou2,".."); + sprintf(html,"\n",hbc1,text[130],text[131]); + fputs(html,fp_ou2); + while(fgets(wwork1,MAXLEN,fp_tmp2)!=NULL) { + wwork1[strlen(wwork1)-1]='\0'; + strcpy(tmp5,wwork1); + if(strstr(tmp5,"-") != 0) { + getword(warea,tmp5,'-'); + name_month(warea); + sprintf(tmp6,"%s-",warea); + name_month(tmp5); + sprintf(nmonth,"%s%s",tmp6,tmp5); + } else { + strcpy(nmonth,tmp5); + name_month(nmonth); + } + sprintf(html,"\n",wwork1,tmp4,nmonth); + fputs(html,fp_ou2); + + sprintf(val1,"%s%s/%s",outdir,tmp4,wwork1); + sprintf(tmp5,"%s%s/%s/index.unsort",outdir,tmp4,wwork1); + if((fp_ou3=fopen(tmp5,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],tmp5); + exit(1); + } + // month dir + dirp3 = opendir(val1); + while ((direntp3 = readdir( dirp3 )) != NULL) { + if(!isdigit(direntp3->d_name[0]) && !isdigit(direntp3->d_name[1])) + continue; + sprintf(warea,"%s\n",direntp3->d_name); + fputs(warea,fp_ou3); + + } + if(fp_ou3) fclose(fp_ou3); + (void)rewinddir(dirp3); + (void)closedir(dirp3); + unlink(wdir_tmp3); + sprintf(tmp6,"%s%s/%s/index.sort",outdir,tmp4,wwork1); + if(strcmp(IndexSortOrder,"A") == 0) + sprintf(csort,"sort -n '%s' -o '%s'", tmp5, tmp6); + else + sprintf(csort,"sort -n -r '%s' -o '%s'", tmp5, tmp6); + system(csort); + unlink(tmp5); + sprintf(val2,"%s%s/%s/index.html",outdir,tmp4,wwork1); + sprintf(val3,"%s/%s",tmp4,wwork1); + unlink(val2); + if((fp_ou3=fopen(val2,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],val2); + exit(1); + } + if((fp_tmp3=fopen(tmp6,"r"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],tmp6); + exit(1); + } + write_html_header(fp_ou3,"../.."); + sprintf(html,"\n",hbc1,text[130],text[131],text[127]); + fputs(html,fp_ou3); + while(fgets(warea,MAXLEN,fp_tmp3)!=NULL) { + warea[strlen(warea)-1]='\0'; + sprintf(html,"\n",warea,tmp4,nmonth,warea); + fputs(html,fp_ou3); + } + if(fp_tmp3) fclose(fp_tmp3); + if(fp_ou3) fclose(fp_ou3); + write_html_trailer(fp_ou3); + unlink(tmp6); + } + write_html_trailer(fp_ou2); + if(fp_ou2) fclose(fp_ou2); + } + (void)rewinddir(dirp); + (void)closedir(dirp); + write_html_trailer(fp_ou); + if(fp_ou) fclose(fp_ou); + if(fp_tmp) fclose(fp_tmp); + unlink(tmp6); + unlink(wdir_tmp2); + } else { + if(strcmp(IndexSortOrder,"A") == 0) + sprintf(warea,"sort -t';' +6.5n +6.2M +6.0n '%s' -o '%s'", wdir_tmp, wdir_tmp2); + else + sprintf(warea,"sort -t';' +6.5nr +6.2Mr +6.0nr '%s' -o '%s'", wdir_tmp, wdir_tmp2); + system(warea); + unlink(wdir_tmp); + if((fp_ou=fopen(wdir,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir); + exit(1); + } + write_html_header(fp_ou,"."); + sprintf(html,"\n",hbc1,text[101],hbc1,text[102],hbc1,text[103],hbc1,text[93],hbc1,text[96]); + fputs(html,fp_ou); + if((fp_tmp2=fopen(wdir_tmp2,"r"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp2); + exit(1); + } + while(fgets(buf,MAXLEN,fp_tmp2)!=NULL) { + getword(period,buf,';'); + getword(period,buf,';'); + getword(data,buf,';'); + getword(tuser,buf,';'); + getword(tbytes,buf,';'); + getword(media,buf,';'); + sprintf(html,"\n",period,ReplaceIndex,period,data,tuser,tbytes,media); + fputs(html,fp_ou); + } + if(fp_tmp2) fclose(fp_tmp2); + unlink(wdir_tmp2); } - + strcpy(html,"
%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%s%s%s
%s%s%s%s%s
"); fputs(html,fp_ou); @@ -189,9 +409,5 @@ void geraindex() strcpy(html,"\n\n"); fputs(html,fp_ou); - fclose(fp_ou); - fclose(fp_tmp); - - unlink(wdir_tmp2); return; } diff --git a/languages/Bulgarian_windows1251 b/languages/Bulgarian_windows1251 index 7fdb18a..dbd61da 100644 --- a/languages/Bulgarian_windows1251 +++ b/languages/Bulgarian_windows1251 @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Catalan b/languages/Catalan index c9ea2e8..1e32cc3 100644 --- a/languages/Catalan +++ b/languages/Catalan @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Czech b/languages/Czech index 97c025a..3f7a6c8 100644 --- a/languages/Czech +++ b/languages/Czech @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Dutch b/languages/Dutch index df3b9a8..7ac2075 100644 --- a/languages/Dutch +++ b/languages/Dutch @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/English b/languages/English index 9a9a82c..7241a66 100644 --- a/languages/English +++ b/languages/English @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/French b/languages/French index 5462c97..ffe7de3 100644 --- a/languages/French +++ b/languages/French @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/German b/languages/German index 1c29b59..c24a0e7 100644 --- a/languages/German +++ b/languages/German @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Greek b/languages/Greek index f730702..9d4e9cd 100644 --- a/languages/Greek +++ b/languages/Greek @@ -126,4 +126,10 @@ "ËçöèÝíôá áñ÷åßá" "Ãñáöéêü" "ÇìÝñåò" -"ÇìÝñåò" \ No newline at end of file +"ÇìÝñåò""YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Hungarian b/languages/Hungarian index 7fb7577..3e72cc3 100644 --- a/languages/Hungarian +++ b/languages/Hungarian @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Indonesian b/languages/Indonesian index b3ccf25..3ce1cf8 100644 --- a/languages/Indonesian +++ b/languages/Indonesian @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Italian b/languages/Italian index 3fc801c..5533f3b 100644 --- a/languages/Italian +++ b/languages/Italian @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Japanese b/languages/Japanese index 01ca1dd..c64e5bf 100644 --- a/languages/Japanese +++ b/languages/Japanese @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Latvian b/languages/Latvian index e0af463..efc41dd 100644 --- a/languages/Latvian +++ b/languages/Latvian @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Polish b/languages/Polish index d097372..3dc4ff1 100644 --- a/languages/Polish +++ b/languages/Polish @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Portuguese b/languages/Portuguese index 4aa2217..a8cb008 100644 --- a/languages/Portuguese +++ b/languages/Portuguese @@ -128,3 +128,10 @@ "DIAS" "DansGuardian" "CAUSA" +"ANO" +"MÊS" +"TAMANHO" +"Janeiro,Fevereiro,Marco,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro" +"Realtime" +"TIPO" +"Auto refresh" diff --git a/languages/Romanian b/languages/Romanian index c0a5a4c..15cd411 100644 --- a/languages/Romanian +++ b/languages/Romanian @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Russian_UTF-8 b/languages/Russian_UTF-8 new file mode 100755 index 0000000..1596305 --- /dev/null +++ b/languages/Russian_UTF-8 @@ -0,0 +1,137 @@ +# by Alex Deiter +"Да" +"Нет" +"Russian" +"Параметры" +"требуется аргумент" +"Инициализация" +"Чтение файла журнала" +"Не могу открыть файл журнала" +"Не могу открыть временный файл" +"Записей прочитано" +"записано" +"Журнал содержит записи разных форматов (squid и др.)" +"Журнал другого формата" +"Журнал в Squid-формате" +"Журнал в неверном формате" +"Записи не найдены" +"Период" +"используется" +"как временный каталог" +"Сортировка файлов" +"Завершено" +"Параметры" +"Имя или IP-адрес" +"Дата от-до" +"Формат даты" +"Европа" +"Америка" +"IP отчет" +"Использовать Ip-адрес вместо имени пользователя" +"Адреса" +"Время" +"Имя" +"Версия Squid" +"Временный каталог" +"Отладочные сообщения" +"Рабочие сообщения" +"Входящий журнал" +"Выходной каталог" +"Использовано" +"параметры" +"E-mail адрес для посылки отчета" +"ст.вывод на консоль" +"Отчет по пользователям и IP-адресам" +"отчеты" +"Не могу открыть файл" +"ЗАПРЕТ" +"Отчет успешно сгенерирован в:" +"Отчет успешно сгенерирован и отослан" +"Создание файла" +"Создание файла периода" +"Файл" +"уже существует, перенесен в" +"Создание index.html" +"Сортировка файлов" +"Отчет" +"Squid не установлен на этой машине" +"Пожалуйста, используйте параметр -v для задания версии Squid" +"Загрузка конфигурации из" +"ошибка malloc" +"Загрузка файла паролей из" +"Создание отчета" +"Распаковка файла журнала" +"Сжатие файла журнала" +"Файл не найден" +"Определение IP-адреса" +"Чтение журнала броузеров" +"Загрузка исключений из" +"исключены" +"Файл исключений" +"Файл конфигурации" +"Журнал броузеров" +"Создание отчета по броузерам" +"версия" +"лимит превышен" +"Добавлено в файл" +"Ковертируйте файл access.log, чтобы дата была понятной" +"Разделите log файл по дате, используя параметр -d" +"по" +"в обратном порядке" +"в обычном порядке" +"Удаляю старый файл отчета" +"Удаляю временные файлы" +"Топ" +"Сайты" +"Сайты и Пользователи" +"Загружаю таблицу пользователя" +"Не могу загрузить. Ошибка памяти" +"Отчет о работе пользователей через Squid" +"Период" +"Пользователь" +"Адреса" +"Подключений" +"Байт" +"Общее время" +"Миллисек." +"Средняя" +"По убыванию (байты)" +"Пользователь" +"Время" +"No" +"Период" +"Дата создания" +"Пользователей" +"Отсортировано" +"Отчет Squid по броузерам" +"Броузер" +"Всего" +"Сгенерирован" +"на" +"Дата/Время" +"IP/Имя" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Russian_koi8 b/languages/Russian_koi8 index fbac81d..e2b6493 100644 --- a/languages/Russian_koi8 +++ b/languages/Russian_koi8 @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Russian_windows1251 b/languages/Russian_windows1251 index fb6beea..ceecb74 100644 --- a/languages/Russian_windows1251 +++ b/languages/Russian_windows1251 @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Serbian b/languages/Serbian index 7016d2c..b2e2bed 100644 --- a/languages/Serbian +++ b/languages/Serbian @@ -129,3 +129,10 @@ "DansGuardian" "DAYS" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Slovak b/languages/Slovak index 4be7c2d..8e11ced 100644 --- a/languages/Slovak +++ b/languages/Slovak @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Spanish b/languages/Spanish index 76e3f0c..ba75182 100644 --- a/languages/Spanish +++ b/languages/Spanish @@ -128,3 +128,10 @@ "DIAS" "DansGuardian" "CAUSA" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Turkish b/languages/Turkish index 33ef742..e9c16c5 100644 --- a/languages/Turkish +++ b/languages/Turkish @@ -128,3 +128,10 @@ "DAYS" "DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/languages/Ukrainian_windows1251 b/languages/Ukrainian_windows1251 index fd09847..5e40284 100644 --- a/languages/Ukrainian_windows1251 +++ b/languages/Ukrainian_windows1251 @@ -128,3 +128,10 @@ "DAYS" DansGuardian" "CAUSE" +"YEAR" +"MONTH" +"SIZE" +"January,February,March,April,May,June,July,August,September,October,November,December" +"Realtime" +"TYPE" +"Auto refresh" diff --git a/lastlog.c b/lastlog.c index 56c0a1c..55d6989 100644 --- a/lastlog.c +++ b/lastlog.c @@ -59,9 +59,11 @@ void mklastlog() local = localtime(&t); strftime(ftime, 127, "%Y%m%d%H%M%S", local); sprintf(buf,"%s %s\n",ftime,direntp->d_name); +printf("BUF=%s\n",buf); fputs(buf,fp_ou); ftot++; } +exit(0); (void)rewinddir( dirp ); (void)closedir( dirp ); diff --git a/log.c b/log.c index 4eaa1c4..f92f8f8 100644 --- a/log.c +++ b/log.c @@ -146,11 +146,12 @@ int main(argc,argv) BlockIt[0]='\0'; ExternalCSSFile[0]='\0'; SquidGuardLogFormat[0]='\0'; + SquidGuardLogAlternate[0]='\0'; strcpy(AccessLog,"/usr/local/squid/var/logs/access.log"); sprintf(ExcludeCodes,"%s/exclude_codes",SYSCONFDIR); strcpy(GraphDaysBytesBarColor,"orange"); - strcpy(BgColor,"#FFFFFF"); + strcpy(BgColor,"#ffffff"); strcpy(TxColor,"#000000"); strcpy(TxBgColor,"lavender"); strcpy(TiColor,"darkblue"); @@ -158,7 +159,7 @@ int main(argc,argv) strcpy(Height,"45"); strcpy(LogoTextColor,"#000000"); strcpy(HeaderColor,"darkblue"); - strcpy(HeaderBgColor,"#DDDDDD"); + strcpy(HeaderBgColor,"#dddddd"); strcpy(LogoTextColor,"#006699"); strcpy(FontSize,"9px"); strcpy(TempDir,"/tmp"); @@ -211,6 +212,12 @@ int main(argc,argv) strcpy(Graphs,"yes"); strcpy(Ulimit,"20000"); strcpy(NtlmUserFormat,"domainname+username"); + strcpy(IndexTree,"file"); + strcpy(RealtimeTypes,"GET,PUT,CONNECT"); + strcpy(RealtimeUnauthRec,"ignore"); + strcpy(SquidguardIgnoreDate,"off"); + strcpy(DansguardianIgnoreDate,"off"); + strcpy(DataFileUrl,"ip"); dia[0]='\0'; mes[0]='\0'; @@ -261,6 +268,12 @@ int main(argc,argv) color3=0; sarglog=0; isalog=0; + dotinuser=0; + realt=0; + realtime_refresh=3; + realtime_access_log_lines=1000; + cost=0.01; + nocost=50000000; bzero(IncludeUsers, MAXLEN); bzero(ExcludeString, MAXLEN); @@ -271,7 +284,7 @@ int main(argc,argv) language_load(language); strcpy(Title,text[88]); - while((ch = getopt(argc, argv, "a:b:c:d:e:f:g:u:l:o:r:s:t:w:hijmnpvxyz")) != -1){ + while((ch = getopt(argc, argv, "a:b:c:d:e:f:g:u:l:L:o:s:t:w:hijmnprvxyz")) != -1){ switch(ch) { case 'a': @@ -311,6 +324,9 @@ int main(argc,argv) strcpy(warq[narq],optarg); narq++; break; + case 'L': + strcpy(SquidGuardLogAlternate,optarg); + break; case 'm': debugm++; break; @@ -323,6 +339,9 @@ int main(argc,argv) case 'p': userip++; break; + case 'r': + realt++; + break; case 's': strcpy(site,optarg); break; @@ -401,6 +420,11 @@ int main(argc,argv) if(access(ConfigFile, R_OK) == 0) getconf(debugm, ConfigFile, AccessLog, debug, BgColor, TxColor, TxBgColor, TiColor, LogoImage, LogoText, LogoTextColor, Width, Height, Title, BgImage, FontFace, HeaderColor, HeaderBgColor, FontSize, PasswdFile, TempDir, OutputDir, OutputEmail, Ip2Name, TopuserSortField, UserSortField, TopuserSortOrder, UserSortOrder, UserAgentLog, ExcludeHosts, DateFormat, ExcludeUsers, PerUserLimitFile, PerUserLimit, UserIp, MaxElapsed); + + if(realt) { + realtime(); + exit(0); + } if(debugz) { fprintf(stderr, "SARG: ConfigFile.........= %s\n",ConfigFile); @@ -440,6 +464,11 @@ int main(argc,argv) fprintf(stderr, "SARG:\n"); } + if(strcmp(IndexTree,"file") == 0) + strcpy(ImageFile,"../images"); + else + strcpy(ImageFile,"../../../images"); + dataonly=0; if(DataFile[0] != '\0'); dataonly++; @@ -493,7 +522,7 @@ int main(argc,argv) } if(ReportType[0] == '\0') - strcpy(ReportType,"topsites users_sites sites_users date_time denied auth_failures site_user_time_date"); + strcpy(ReportType,"topusers topsites users_sites sites_users date_time denied auth_failures site_user_time_date downloads"); if(access(ExcludeUsers, R_OK) == 0) { getuexclude(ExcludeUsers,debug); @@ -551,9 +580,6 @@ int main(argc,argv) } strcpy(tmp2,tmp); - strcpy(tmp4,tmp); - strcpy(tmp5,tmp); - strcpy(tmp6,tmp); if(strlen(email) > 0) { sprintf(wtemp2,"%s/sarg_tmp",tmp2); @@ -573,6 +599,9 @@ int main(argc,argv) sprintf(tmp3,"%s/sarg",tmp); my_mkdir(tmp3); + strcpy(tmp4,tmp3); + strcpy(tmp5,tmp3); + strcpy(tmp6,tmp3); strcat(tmp4,"/denied.log.unsort"); strcat(tmp5,"/denied.log"); strcat(tmp6,"/authfail.log.unsort"); @@ -893,7 +922,6 @@ int main(argc,argv) if(!common) { getword(elap,bufz,' '); - bzero(elap, 255); while(strcmp(elap,"") == 0 && strlen(bufz) > 0) getword(elap,bufz,' '); if(strlen(elap) < 1) continue; @@ -983,7 +1011,6 @@ int main(argc,argv) sprintf(user,"%s.%s",w,wuser); } - dotinuser=0; str=user; for(z1=0; z1 512 && strstr(url,"%") != 0) { + getword(w,url,'%'); + strcpy(url,w); + } } if(!sarglog) { @@ -1037,8 +1072,10 @@ int main(argc,argv) strftime(tbuf, 127, "%Y%b%d", t); if(strncmp(df,"e",1) == 0) strftime(tbuf, 127, "%d%b%Y", t); - if(strncmp(df,"w",1) == 0) + if(strncmp(df,"w",1) == 0) { + strcpy(IndexTree,"file"); strftime(tbuf, 127, "%Y.%U", t); + } strftime(dia, 127, "%d/%m/%Y", t); strftime(wdata, 127, "%Y%m%d", t); @@ -1134,6 +1171,10 @@ int main(argc,argv) if(puser) { sprintf(wuser,":%s:",user); + if(dotinuser && strstr(wuser,"_")) { + str2=(char *)subs(wuser,"_","."); + strcpy(wuser,str2); + } if(strstr(userfile, wuser) == 0) continue; } @@ -1377,14 +1418,14 @@ int main(argc,argv) debuga(msg); } } - - sort_users_log(tmp, debug); if(strstr(ReportType,"denied") != 0) { sprintf(csort,"sort -T %s -k 3,3 -k 5,5 -o '%s' '%s'",tmp,tmp5,tmp4); system(csort); unlink(tmp4); } + + sort_users_log(tmp, debug); report_gen: if(strlen(DataFile) > 0) @@ -1406,6 +1447,15 @@ int main(argc,argv) sprintf(csort,"rm -rf %s",tmp); system(csort); + if(excludecode) + free(excludecode); + if(userfile) + free(userfile); + if(excludefile) + free(excludefile); + if(excludeuser) + free(excludeuser); + exit(0); } diff --git a/repday.c b/repday.c index 058a0a9..e9cb490 100644 --- a/repday.c +++ b/repday.c @@ -98,7 +98,11 @@ void report_day(char *user, int *iprel, int *ipuser) fputs("\n",fp_ou); } - show_sarg(fp_ou,"../.."); + 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); diff --git a/report.c b/report.c index 03ae6a1..5cc52ec 100644 --- a/report.c +++ b/report.c @@ -79,6 +79,10 @@ void gerarel() continue; if(strncmp(direntp->d_name,"download.log",12) == 0) continue; + if(strncmp(direntp->d_name,"denied.log",10) == 0) + continue; + if(strncmp(direntp->d_name,"authfail.log.unsort",19) == 0) + continue; sprintf(tmp3,"%s/%s",tmp,direntp->d_name); if((fp_in=fopen(tmp3,"r"))==NULL){ fprintf(stderr, "SARG: (report) %s: %s\n",text[45],tmp); @@ -243,7 +247,10 @@ void gerarel() fputs("
%s
\n",fp_tt); } - show_sarg(fp_tt, "../.."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_tt, "../../../.."); + else + show_sarg(fp_tt, "../.."); sprintf(html,"%s\n",Title); fputs(html,fp_tt); @@ -342,17 +349,16 @@ void gerarel() totalger(wdirname, debug, outdir); if(strlen(email) == 0) { - download_report(); + if(strstr(ReportType,"downloads") != 0) + download_report(); if(strlen(DansGuardianConf) > 0) { strcpy(wdirname,dirname); dansguardian_log(); } - if(strlen(SquidGuardConf) > 0) { - strcpy(wdirname,dirname); - squidguard_log(); - } + strcpy(wdirname,dirname); + squidguard_log(); strcpy(wdirname,dirname); topuser(); @@ -373,13 +379,12 @@ void gerarel() if(strlen(DansGuardianConf) > 0) dansguardian_report(); - if(strlen(SquidGuardConf) > 0) - squidguard_report(); + squidguard_report(); if(strstr(ReportType,"users_sites") != 0) htmlrel(); - geraindex(); + make_index(); if(strncmp(SuccessfulMsg,"yes",3) == 0) fprintf(stderr, "SARG: %s %s\n",text[47],dirname); diff --git a/sarg-php/sarg-realtime.php b/sarg-php/sarg-realtime.php new file mode 100755 index 0000000..9977b6f --- /dev/null +++ b/sarg-php/sarg-realtime.php @@ -0,0 +1,5 @@ + diff --git a/sarg.conf b/sarg.conf index e56bee7..316a4ec 100644 --- a/sarg.conf +++ b/sarg.conf @@ -19,6 +19,7 @@ # Portuguese # Romanian # Russian_koi8 +# Russian_UFT-8 # Russian_windows1251 # Serbian # Slovak @@ -123,8 +124,8 @@ #background_image none # TAG: password -# User password file used by authentication -# If used here, reports will be generated only for that users. +# User password file used by Squid authentication scheme +# If used, generate reports just for that users. # #password none @@ -185,7 +186,7 @@ #exclude_hosts none # TAG: useragent_log file -# Put here where is useragent.log to nable useragent report. +# useragent.log file patch to generate useragent report. # #useragent_log none @@ -218,6 +219,11 @@ # #index yes +# TAG: index_tree date|file +# How to generate the index. +# +#index_tree file + # TAG: overwrite_report yes|no # yes - if report date already exist then will be overwrited. # no - if report date already exist then will be renamed to filename.n, filename.n+1 @@ -281,17 +287,19 @@ max_elapsed 28800000 # TAG: report_type type # What kind of reports to generate. -# topsites - shows the site, connect and bytes -# sites_users - shows which users were accessing a site -# users_sites - shows sites accessed by the user -# date_time - shows the amount of bytes used by day and hour -# denied - shows all denied sites with full URL -# auth_failures - shows autentication failures -# site_user_time_date - shows sites, dates, times and bytes +# topusers - users, sites, times, bytes, connects, links to accessed sites, etc +# topsites - site, connect and bytes report +# sites_users - users and sites report +# users_sites - accessed sites by the user report +# date_time - bytes used per day and hour report +# denied - denied sites with full URL report +# auth_failures - autentication failures report +# site_user_time_date - sites, dates, times and bytes report +# downloads - downloads per user report # # Eg.: report_type topsites denied # -#report_type topsites sites_users users_sites date_time denied auth_failures site_user_time_date +#report_type topusers topsites sites_users users_sites date_time denied auth_failures site_user_time_date downloads # TAG: usertab filename # You can change the "userid" or the "ip address" to be a real user name on the reports. @@ -398,7 +406,6 @@ max_elapsed 28800000 # Save the report results in a file to populate some database # #datafile none -#datafile /tmp/p8 # TAG: datafile_delimiter ";" # ascii character to use as a field separator in datafile @@ -411,6 +418,11 @@ max_elapsed 28800000 # #datafile_fields user;date;time;url;connect;bytes;in_cache;out_cache;elapsed +# TAG: datafile_url ip|name +# Saves the URL as ip or name in datafile +# +#datafile ip + # TAG: weekdays # The weekdays to take account ( Sunday->0, Saturday->6 ) # Example: @@ -433,14 +445,27 @@ max_elapsed 28800000 # #dansguardian_conf none +# TAG: dansguardian_ignore_date on|off +# Use 'on' use the record even the date range is different from the used squid access.log file. +# Use 'off' use the record only if the date range is in the used squid access.log file. +# +#dansguardian_ignore_date off + # TAG: squidguard_conf file # path to squidGuard.conf file # Generate reports from SquidGuard logs. # Use 'none' to disable. +# You can use sarg -L filename to use an alternate squidGuard log. # squidguard_conf /usr/local/squidGuard/squidGuard.conf # #squidguard_conf none +# TAG: squidguard_ignore_date on|off +# Use 'on' use the record even the date range is different from the used squid access.log file. +# Use 'off' use the record only if the date range is in the used squid access.log file. +# +#squidguard_ignore_date off + # TAG: squidguard_log_format # Format string SquidGuard logs. # REJIK #year#-#mon#-#day# #hour# #list#:#tmp# #ip# #user# #tmp#/#tmp#/#url#/#end# @@ -465,12 +490,12 @@ max_elapsed 28800000 # #parsed_output_log none -# TAG parsed_output_log_compress /bin/gzip|/usr/bin/bzip2|nocompress +# TAG: parsed_output_log_compress /bin/gzip|/usr/bin/bzip2|nocompress # sarg logs compress util # #parsed_output_log_compress /bin/gzip -# TAG displayed_values bytes|abbreviation +# TAG: displayed_values bytes|abbreviation # how the values will be displayed in reports. # eg. bytes - 209.526 # abbreviation - 210K @@ -478,13 +503,13 @@ max_elapsed 28800000 #displayed_values bytes # Report limits -# TAG authfail_report_limit n -# TAG denied_report_limit n -# TAG siteusers_report_limit n -# TAG squidguard_report_limit n -# TAG user_report_limit n -# TAG dansguardian_report_limit n -# TAG download_report_limit n +# TAG: authfail_report_limit n +# TAG: denied_report_limit n +# TAG: siteusers_report_limit n +# TAG: squidguard_report_limit n +# TAG: user_report_limit n +# TAG: dansguardian_report_limit n +# TAG: download_report_limit n # report limits (lines). # '0' no limit # @@ -496,14 +521,14 @@ max_elapsed 28800000 #user_report_limit 10 #user_report_limit 50 -# TAG www_document_root dir +# TAG: www_document_root dir # Where is your Web DocumentRoot # Sarg will create sarg-php directory with some PHP modules: # - sarg-squidguard-block.php - add urls from user reports to squidGuard DB # #www_document_root /var/www/html -# TAG block_it module_url +# TAG: block_it module_url # This tag allow you to pass urls from user reports to a cgi or php module, # to be blocked by some Squid acl # @@ -516,7 +541,7 @@ max_elapsed 28800000 # #block_it none -# TAG external_css_file path +# TAG: external_css_file path # This tag allow internal sarg css override. # Sarg use theses style classes: # .body body class @@ -534,7 +559,7 @@ max_elapsed 28800000 # #external_css_file none -# TAG user_authentication yes|no +# TAG: user_authentication yes|no # Allow user authentication in User Reports using .htaccess # Parameters: # AuthUserFile - where the user password file is @@ -549,19 +574,49 @@ max_elapsed 28800000 # AuthType Basic # Require user admin %u -# TAG download_suffix "suffix,suffix,...,suffix" +# TAG: download_suffix "suffix,suffix,...,suffix" # file suffix to be considered as "download" in Download report. # Use 'none' to disable. # #download_suffix "zip,arj,bzip,gz,ace,doc,iso,adt,bin,cab,com,dot,drv$,lha,lzh,mdb,mso,ppt,rtf,src,shs,sys,exe,dll,mp3,avi,mpg,mpeg" -# ulimit n +# TAG: ulimit n # The maximum number of open file descriptors to avoid "Too many open files" error message. # You need to run sarg as root to use ulimit tag. # #ulimit 20000 -# TAG: ntlm_user_format username|domainname+username -# NTLM users format. +# TAG: ntlm_user_format username|domainname+username +# NTLM users format. # #ntlm_user_format domainname+username + +# TAG: realtime_refresh_time num sec +# How many time to auto refresh the realtime report +# 0 = disable +# +# realtime_refresh_time 3 + +# TAG: realtime_access_log_lines num +# How many last lines to get from access.log file +# +# realtime_access_log_lines 1000 + +# TAG: realtime_types: GET,PUT,CONNECT,ICP_QUERY,POST +# Which records must be in realtime report. +# +# realtime_types GET,PUT,CONNECT + +# TAG: realtime_unauthenticated_records: ignore|show +# What to do with unauthenticated records in realtime report. +# +# realtime_unauthenticated_records: ignore + +# TAG: byte_cost value no_cost_limit +# Cost per byte. +# Eg. byte_cost 0.01 100000000 +# per byte cost = 0.01 +# bytes with no cost = 100 Mb +# 0 = disable +# +# byte_cost 0.01 50000000 diff --git a/siteuser.c b/siteuser.c index 5af74ca..7c193e8 100644 --- a/siteuser.c +++ b/siteuser.c @@ -101,7 +101,11 @@ void siteuser() fputs("\n",fp_ou); } - show_sarg(fp_ou, ".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_ou, "../../.."); + else + show_sarg(fp_ou, ".."); + fputs("
\n",fp_ou); sprintf(url,"\n",Title); fputs(url,fp_ou); @@ -214,6 +218,9 @@ void siteuser() fclose(fp_in); fclose(fp_ou); + if(users) + free(users); + return; } diff --git a/sort.c b/sort.c index 93adadd..48e936f 100644 --- a/sort.c +++ b/sort.c @@ -124,6 +124,9 @@ void sort_users_log(char *tmp, int debug) while ( (direntp = readdir( dirp )) != NULL ){ if(strstr(direntp->d_name,".unsort") == 0) continue; + if(strcmp(direntp->d_name,"denied.log") == 0 || strcmp(direntp->d_name,"authfail.log.unsort") == 0) + continue; + strcpy(wdname,direntp->d_name); bzero(user, MAXLEN); diff --git a/squidguard_log.c b/squidguard_log.c index 440dce7..54808b1 100644 --- a/squidguard_log.c +++ b/squidguard_log.c @@ -25,166 +25,205 @@ #include "include/conf.h" +void read_log(char *wentp, FILE *fp_ou) +{ + FILE *fp_in = NULL; + char bufbsf[255]; + char leks[5], sep[2], res[MAXLEN]; + char mon[10], hour[15]; + char list[MAXLEN]; + char wdata[127]; + int idata=0; + + if(debug) { + strcpy(buf,text[7]); + getword(urly,buf,' '); + getword(href,buf,' '); + sprintf(msg,"%s squidGuard %s: %s",urly,buf,wentp); + debuga(msg); + } + + if ((fp_in=fopen(wentp,"r"))==NULL) { + fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],wentp); + exit(1); + } + + while (fgets(buf,sizeof(buf),fp_in) != NULL) { + if(strlen(SquidGuardLogFormat) > 0) { + strcpy(bufbsf,SquidGuardLogFormat); + leks[0]='\0'; + getword(leks,bufbsf,'#'); + while(strcmp(leks,"end") != 0) { + getword(leks,bufbsf,'#'); + getword(sep,bufbsf,'#'); + if(strcmp(leks,"end") != 0) { + getword(res,buf,sep[0]); + if(strcmp(leks,"year") == 0) + strcpy(year,res); + else if(strcmp(leks,"year") == 0) + strcpy(year,res); + else if(strcmp(leks,"mon") == 0) + strcpy(mon,res); + else if(strcmp(leks,"day") == 0) + strcpy(day,res); + else if(strcmp(leks,"hour") == 0) + strcpy(hour,res); + else if(strcmp(leks,"list") == 0) + strcpy(list,res); + else if(strcmp(leks,"ip") == 0) + strcpy(ip,res); + else if(strcmp(leks,"user") == 0) + strcpy(user,res); + else if(strcmp(leks,"url") == 0) + strcpy(url,res); + } + } + } else { + getword(year,buf,'-'); + getword(mon,buf,'-'); + getword(day,buf,' '); + getword(hour,buf,' '); + getword(list,buf,'/'); + getword(list,buf,'/'); + getword(tmp5,buf,'/'); + getword(tmp5,buf,'/'); + getword(url,buf,'/'); + getword(ip,buf,' '); + getword(ip,buf,'/'); + getword(user,buf,' '); + getword(user,buf,' '); + } + + sprintf(warea,"%s%s%s",year,mon,day); + sprintf(wdata,"%s%s%s",year,mon,day); + idata = atoi(wdata); + + if(strcmp(SquidguardIgnoreDate,"on") == 0) { + if(idata < dfrom && idata > duntil) + continue; + } + + if (strcmp(user,"-") == 0) { + strcpy(user,ip); + bzero(ip, 30); + } + sprintf(tmp6,"%s %s%s%s %s %s %s %s\n",user,year,mon,day,hour,ip,url,list); + fputs(tmp6, fp_ou); + squidguard_count++; + } + if (fp_in) fclose(fp_in); + return; +} + + int squidguard_log() { - FILE *fp_in = NULL, *fp_ou = NULL, *fp_guard = NULL; + FILE *fp_ou = NULL, *fp_guard = NULL; char guard_in[MAXLEN]; char guard_ou[MAXLEN]; char logdir[MAXLEN]; - char year[10], mon[10], day[10], hour[15]; - char list[MAXLEN]; + char year[10], day[10], mon[10]; char user[MAXLEN]; char ip[30]; - char wdata[127]; - char bufbsf[255]; - char leks[5], sep[2], res[MAXLEN]; - int idata=0; int x, y; - if(strlen(SquidGuardConf) < 1) + if(strlen(SquidGuardConf) < 1 && strlen(SquidGuardLogAlternate) < 1) return; - bzero(day, 3); - bzero(mon, 4); - bzero(year, 5); - - if(strcmp(df,"e") == 0) { - strncpy(day,periodo,2); - strncpy(mon,periodo+2,3); - strncpy(year,periodo+5,4); - conv_month(mon); - sprintf(warea,"%s%s%s",year,mon,day); - dfrom=atoi(warea); - strncpy(day,periodo+10,2); - strncpy(mon,periodo+12,3); - strncpy(year,periodo+15,4); - conv_month(mon); - sprintf(warea,"%s%s%s",year,mon,day); - duntil=atoi(warea); - } else { - strncpy(day,periodo+7,2); - strncpy(mon,periodo+4,3); - strncpy(year,periodo,4); - conv_month(mon); - sprintf(warea,"%s%s%s",year,mon,day); - dfrom=atoi(warea); - strncpy(day,periodo+17,2); - strncpy(mon,periodo+14,3); - strncpy(year,periodo+10,4); - conv_month(mon); - sprintf(warea,"%s%s%s",year,mon,day); - duntil=atoi(warea); - } + if (strlen(SquidGuardLogAlternate) > 0) + SquidGuardConf[0]='\0'; sprintf(guard_in,"%s/squidguard.unsort",tmp); sprintf(guard_ou,"%s/squidguard.log",tmp); - - if(access(SquidGuardConf, R_OK) != 0) { - sprintf(msg,"Cannot open squidGuard config file: %s",SquidGuardConf); - debuga(msg); - exit(1); - } - - if((fp_guard=fopen(SquidGuardConf,"r"))==NULL) { - fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],SquidGuardConf); - exit(1); - } - if((fp_ou=fopen(guard_in,"a"))==NULL) { fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],guard_in); exit(1); } - while(fgets(buf,sizeof(buf),fp_guard)!=NULL) { - if(strstr(buf,"\n") != 0) - buf[strlen(buf)-1]='\0'; - if(strstr(buf,"logdir ") != 0) { - getword(logdir,buf,' '); - getword(logdir,buf,' '); + bzero(day, 3); + bzero(mon, 4); + bzero(year, 5); + + if(strcmp(SquidguardIgnoreDate,"on") == 0) { + if(strcmp(df,"e") == 0) { + strncpy(day,periodo,2); + strncpy(mon,periodo+2,3); + strncpy(year,periodo+5,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + dfrom=atoi(warea); + strncpy(day,periodo+10,2); + strncpy(mon,periodo+12,3); + strncpy(year,periodo+15,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + duntil=atoi(warea); + } else { + strncpy(day,periodo+7,2); + strncpy(mon,periodo+4,3); + strncpy(year,periodo,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + dfrom=atoi(warea); + strncpy(day,periodo+17,2); + strncpy(mon,periodo+14,3); + strncpy(year,periodo+10,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + duntil=atoi(warea); } - if((str=(char *) strstr(buf, "log")) != (char *) NULL ) { - str=str+3; - str2[0]='\0'; - y=0; - for (x=0; x<=strlen(str); x++) { - if (str[x] != ' ' && str[x] != '\t') { - str2[y] = str[x]; - y++; - } - } - - sprintf(wentp,"%s/%s",logdir,str2); + } - if(debug) { - strcpy(buf,text[7]); + if(strlen(SquidGuardConf) > 0) { + if(access(SquidGuardConf, R_OK) != 0) { + sprintf(msg,"Cannot open squidGuard config file: %s",SquidGuardConf); + debuga(msg); + exit(1); + } - getword(urly,buf,' '); - getword(href,buf,' '); - sprintf(msg,"%s squidGuard %s: %s",urly,buf,wentp); - debuga(msg); - } + if((fp_guard=fopen(SquidGuardConf,"r"))==NULL) { + fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],SquidGuardConf); + exit(1); + } - if((fp_in=fopen(wentp,"r"))==NULL) { - fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],wentp); - exit(1); + while(fgets(buf,sizeof(buf),fp_guard)!=NULL) { + if(strstr(buf,"\n") != 0) + buf[strlen(buf)-1]='\0'; + if(strstr(buf,"logdir ") != 0) { + getword(logdir,buf,' '); + getword(logdir,buf,' '); } - - while(fgets(buf,sizeof(buf),fp_in) != NULL) { - - if(strlen(SquidGuardLogFormat) > 0) { - strcpy(bufbsf,SquidGuardLogFormat); - leks[0]='\0'; - getword(leks,bufbsf,'#'); - while(strcmp(leks,"end") != 0) { - getword(leks,bufbsf,'#'); - getword(sep,bufbsf,'#'); - if(strcmp(leks,"end") != 0) { - getword(res,buf,sep[0]); - if(strcmp(leks,"year") == 0) - strcpy(year,res); - else if(strcmp(leks,"year") == 0) - strcpy(year,res); - else if(strcmp(leks,"mon") == 0) - strcpy(mon,res); - else if(strcmp(leks,"day") == 0) - strcpy(day,res); - else if(strcmp(leks,"hour") == 0) - strcpy(hour,res); - else if(strcmp(leks,"list") == 0) - strcpy(list,res); - else if(strcmp(leks,"ip") == 0) - strcpy(ip,res); - else if(strcmp(leks,"user") == 0) - strcpy(user,res); - else if(strcmp(leks,"url") == 0) - strcpy(url,res); - } + if((str=(char *) strstr(buf, "log")) != (char *) NULL ) { + str=str+3; + str2[0]='\0'; + y=0; + for (x=0; x<=strlen(str); x++) { + if (str[x] != ' ' && str[x] != '\t') { + str2[y] = str[x]; + y++; } } - - sprintf(warea,"%s%s%s",year,mon,day); - sprintf(wdata,"%s%s%s",year,mon,day); - idata = atoi(wdata); - - if(idata >= dfrom && idata <= duntil) { - if(strcmp(user,"-") == 0) { - strcpy(user,ip); - bzero(ip, 30); - } - sprintf(tmp6,"%s %s%s%s %s %s %s %s\n",user,year,mon,day,hour,ip,url,list); - fputs(tmp6, fp_ou); - squidguard_count++; - } + sprintf(wentp,"%s/%s",logdir,str2); + read_log(wentp,fp_ou); } - fclose(fp_in); } + } else { + sprintf(wentp,"%s",SquidGuardLogAlternate); + read_log(wentp,fp_ou); + } + + if (fp_guard) fclose(fp_guard); + if (fp_ou) fclose(fp_ou); + + if(debug) { + sprintf(msg,"%s: %s",text[54],guard_ou); + debuga(msg); } - fclose(fp_guard); - fclose(fp_ou); sprintf(tmp6,"sort -k 1,1 -k 2,2 -k 4,4 '%s' -o '%s'",guard_in, guard_ou); system(tmp6); + unlink(guard_in); return; } diff --git a/squidguard_report.c b/squidguard_report.c index 5817904..ca6c4e6 100644 --- a/squidguard_report.c +++ b/squidguard_report.c @@ -105,7 +105,10 @@ void squidguard_report() fputs("
%s
\n",fp_ou); } - show_sarg(fp_ou,".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_ou, "../../.."); + else + show_sarg(fp_ou,".."); fputs("
\n",fp_ou); sprintf(url,"\n",Title); fputs(url,fp_ou); diff --git a/topsites.c b/topsites.c index d6043f1..11c6e8c 100644 --- a/topsites.c +++ b/topsites.c @@ -62,7 +62,11 @@ void topsites() sprintf(geral2,"%s/geral2",dirname); sprintf(geral3,"%s/geral3",dirname); sprintf(per,"%s/periodo",dirname); - sprintf(report,"%s/topsites.html",dirname); + + if (strstr(ReportType,"topusers") == 0) + sprintf(report,"%s/index.html",dirname); + else + sprintf(report,"%s/topsites.html",dirname); if ((fp_in = fopen(per, "r")) == 0) { fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],per); @@ -183,7 +187,11 @@ void topsites() fputs("
%s
\n",fp_ou); } - show_sarg(fp_ou,".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_ou,"../../.."); + else + show_sarg(fp_ou, ".."); + fputs("
\n",fp_ou); sprintf(url,"\n",Title); fputs(url,fp_ou); diff --git a/topuser.c b/topuser.c index 6b79d78..36b1c07 100644 --- a/topuser.c +++ b/topuser.c @@ -28,7 +28,7 @@ int topuser() { - FILE *fp_in, *fp_ou, *fp_top1, *fp_top2, *fp_top3; + FILE *fp_in = NULL, *fp_ou = NULL, *fp_top1 = NULL, *fp_top2 = NULL, *fp_top3 = NULL; long long int ttnbytes=0, ttnacc=0, tnacc=0; long long int tnbytes=0, ttnelap=0, tnelap=0; long long int tnincache=0, tnoucache=0, ttnincache=0, ttnoucache=0; @@ -43,7 +43,7 @@ int topuser() char ipantes[MAXLEN], nameantes[MAXLEN]; char sfield[10]="2,2"; char order[255]="-r"; - char wheader[512]; + char wheader[512]=""; char ftime[128]; int totuser=0; int topcount=0; @@ -60,7 +60,7 @@ int topuser() strcat(wger,"/geral"); strcat(top1,"/top"); strcat(top2,"/top.tmp"); - strcat(tusr,"/usuarios"); + strcat(tusr,"/users"); strcat(top3,"/index.html"); if((fp_in=fopen(wger,"r"))==NULL) { @@ -154,8 +154,8 @@ int topuser() my_lltoa(ttnincache,val4,15); my_lltoa(ttnoucache,val5,15); sprintf(preg,"TOTAL %s %s %s %s %s\n",val1,val2,val3,val4,val5); - fclose(fp_in); - fclose(fp_top2); + if (fp_in) fclose(fp_in); + if (fp_top2) fclose(fp_top2); strup(TopuserSortField); strlow(TopuserSortOrder); @@ -230,7 +230,10 @@ int topuser() fputs("
%s
\n",fp_top3); } - show_sarg(fp_top3, ".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_top3, "../../.."); + else + show_sarg(fp_top3, ".."); fputs("
\n",fp_top3); sprintf(preg,"\n",Title); fputs(preg,fp_top3); @@ -271,17 +274,17 @@ int topuser() fputs(preg,fp_top3); } - if(download_count) { + if (strstr(ReportType,"downloads") != 0 && download_count) { sprintf(preg,"\n",text[125],text[55]); fputs(preg,fp_top3); } - if(denied_count) { + if (strstr(ReportType,"denied") != 0 && denied_count) { sprintf(preg,"\n",text[118],text[55]); fputs(preg,fp_top3); } - if(authfail_count) { + if (strstr(ReportType,"auth_failures") != 0 && authfail_count) { sprintf(preg,"\n",text[117],text[55]); fputs(preg,fp_top3); } @@ -293,6 +296,12 @@ int topuser() strcpy(preg,"\n"); fputs(preg,fp_top3); + if (strstr(ReportType,"topuser") == 0) { + fputs("\n\n",fp_top3); + if (fp_top3) + fclose (fp_top3); + return; + } strcpy(val1,text[100]); strcpy(val2,text[98]); strcpy(val3,text[92]); @@ -465,9 +474,9 @@ int topuser() sprintf(val1,"%d",posicao); #ifdef HAVE_GD - sprintf(val2,"%s %s\n",href3,text[126],text[55],href2,ltext110,text[55]); + sprintf(val2,"%s %s\n",href3,ImageFile,text[126],text[55],href2,ImageFile,ltext110,text[55]); #else - sprintf(val2,"%s\n",href2,ltext110,text[55]); + sprintf(val2,"%s\n",href2,ImageFile,ltext110,text[55]); #endif sprintf(val3,"%3.2f%%",perc); @@ -534,6 +543,7 @@ int topuser() if(dotinuser && strstr(name,"_")) { str2=(char *)subs(name,"_","."); strcpy(name,str2); + free(str2); } sprintf(preg,"\n",hbc1,val1,hbc2,val2,hbc2,href,name,hbc3,wwork1,hbc4,wwork2,hbc5,val3,hbc6,val4,hbc7,val5,hbc8,val6,hbc9,wwork3,hbc10,val7); diff --git a/totger.c b/totger.c index 6c22e9e..6c4130f 100644 --- a/totger.c +++ b/totger.c @@ -60,7 +60,6 @@ int totalger(const char *dirname, int debug, const char *outdir) while(!feof(fp_in)) { - tnacc+=my_atoll(nacc); tnbytes+=my_atoll(nbytes); telap+=my_atoll(elap); diff --git a/usage.c b/usage.c index 7477083..2b19c1d 100644 --- a/usage.c +++ b/usage.c @@ -50,7 +50,7 @@ void usage(char *prog) fprintf(stderr, "%5s-convert %s\n"," ",text[76]); fprintf(stderr, "%5s-split %s\n"," ",text[77]); fprintf(stderr, "\n\t%s-%s %s Pedro Lineu Orso - orso@penguintech.com.br\n",PGM,VERSION,text[78]); - fprintf(stderr, "\thttp://www.sarg-squid.org\n"); + fprintf(stderr, "\thttp://sarg.sourceforge.net\n"); fprintf(stderr, "\n\tPease donate to the sarg project:"); fprintf(stderr, "\n\t\thttp://sarg.sourceforge.net/donations.php\n\n"); diff --git a/useragent.c b/useragent.c index 67ccf8a..1457521 100644 --- a/useragent.c +++ b/useragent.c @@ -160,7 +160,10 @@ void useragent() fputs("
%s
%s %s
%s %s
%s %s
%s%s%s%s%s%s%s%s%s%s%s%s
\n",fp_ht); } - show_sarg(fp_ht,".."); + if(strcmp(IndexTree,"date") == 0) + show_sarg(fp_ht, "../../.."); + else + show_sarg(fp_ht,".."); fputs("
\n",fp_ht); sprintf(html,"\n",TiColor,text[105]); fputs(html,fp_ht); diff --git a/util.c b/util.c index f663639..77067bf 100644 --- a/util.c +++ b/util.c @@ -308,6 +308,20 @@ void conv_month_name(char *month) } +void name_month(char *month) +{ + int x, z=atoi(month)-1; + char m[255]; + char w[20]; + + strcpy(m,text[133]); + + for(x=0; x 0) { strcat(wdir,"-"); @@ -659,33 +722,61 @@ void vrfydir(char *dir, char *per1, char *addr, char *site, char *us, char *form if(strcmp(dirname,wdir) != 0) strcpy(dirname,wdir); - strcpy(dirname2,dirname); - - if(strcmp(OverwriteReport,"no") == 0) { - while(num) { - if(access(wdir,R_OK) == 0) { - sprintf(wdir,"%s.%d",dirname,num); - sprintf(per2,"%s.%d",per1,num); - num++; - count++; - } else - break; - } + if(strcmp(IndexTree,"date") != 0) { + strcpy(dirname2,dirname); + if(strcmp(OverwriteReport,"no") == 0) { + while(num) { + if(access(wdir,R_OK) == 0) { + sprintf(wdir,"%s.%d",dirname,num); + sprintf(per2,"%s.%d",per1,num); + num++; + count++; + } else + break; + } - if(count > 0) { - if(debug) - fprintf(stderr, "SARG: %s: %s %s %s\n",text[51],dirname2,text[52],wdir); - rename(dirname2,wdir); + if(count > 0) { + if(debug) + fprintf(stderr, "SARG: %s: %s %s %s\n",text[51],dirname2,text[52],wdir); + rename(dirname2,wdir); + } + } else { + if(access(dir,R_OK) == 0) { + sprintf(csort,"rm -r %s",dir); + system(csort); + } } + my_mkdir(dirname); } else { - if(access(dir,R_OK) == 0) { - sprintf(csort,"rm -r %s",dir); - system(csort); + strcpy(dirname2,wdir); + if(strcmp(OverwriteReport,"no") == 0) { + while(num) { + if(access(wdir,R_OK) == 0) { + sprintf(wdir,"%s.%d",dirname2,num); + sprintf(per2,"%s.%d",per1,num); + num++; + count++; + } else + break; + } + + if(count > 0) { + if(debug) + fprintf(stderr, "SARG: %s: %s %s %s\n",text[51],dirname2,text[52],wdir); + rename(dirname2,wdir); + strcpy(dirname2,wdir); + } + } else { + if(access(wdir,R_OK) == 0) { + sprintf(csort,"rm -r %s",wdir); + system(csort); + } } + + if(access(wdir, R_OK) != 0) + my_mkdir(wdir); } - my_mkdir(dirname); - strcpy(dirname2,wdir); sprintf(images,"%simages",outdir); mkdir(images,0755); @@ -874,7 +965,7 @@ char *subs(char *str, char *from, char *to) if(strstr(str,from) == 0) return (char *) str; - ss = strlen(str); st = strlen(to); + ss = strlen(str); st = strlen(to) + 10; ret = (char *) malloc(ss + st); bzero(ret,ss+st); @@ -1076,7 +1167,7 @@ void show_sarg(FILE *fp_ou, char *ind) { if(strcmp(ShowSargLogo,"yes") == 0) { fputs("
%s
\n",fp_ou); - sprintf(html,"\n",ind,Title); + sprintf(html,"\n",ind,Title); fputs(html,fp_ou); sprintf(html,"\n",Title); fputs(html,fp_ou); @@ -1084,6 +1175,61 @@ void show_sarg(FILE *fp_ou, char *ind) } } +get_size(char *path, char *file) +{ + FILE *fp; + char response[255]; + + sprintf(cmd,"du -skh %s%s",path,file); + fp = popen(cmd, "r"); + fgets(response, 255, fp); + getword(val5,response,'\t'); + pclose(fp); + + return (val5); +} + + +void write_html_header(FILE *fp_ou, char * ind) +{ + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + fputs("\n",fp_ou); + css(fp_ou); + sprintf(buf,"\n",FontFace,TitleFontSize,BgColor,BgImage); + fputs(buf,fp_ou); + sprintf(buf,"
 Squid Analysis Report Generator
 Squid Analysis Report Generator
 
\n"); + fputs(buf,fp_ou); + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_ou); + sprintf(html,"\n",LogoImage,Width,Height,LogoText); + fputs(html,fp_ou); + fputs("\n",fp_ou); + fputs("
 %s
\n",fp_ou); + } + show_sarg(fp_ou, ind); + sprintf(html,"%s\n",Title); + fputs(html,fp_ou); + fputs("
\n",fp_ou); + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + +} + + +void write_html_trailer(FILE *fp_ou) +{ + fputs("
\n",fp_ou); + zdate(ftime, DateFormat); + show_info(fp_ou); + fputs("\n\n",fp_ou); +} + + char url_module(char *url, char *w2) { int x, y; -- 2.39.5