]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - dansguardian_report.c
Rename configure.in as configure.ac
[thirdparty/sarg.git] / dansguardian_report.c
index e87718000c7087eccaa5c5b0cac4b59a46c0181c..08c2a57abf3afaf9224ceb95c2b3b7ef75de3ab4 100644 (file)
@@ -1,10 +1,11 @@
 /*
- * AUTHOR: Pedro Lineu Orso                         pedro.orso@gmail.com
- *                                                            1998, 2008
  * SARG Squid Analysis Report Generator      http://sarg.sourceforge.net
+ *                                                            1998, 2015
  *
  * 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
  */
 
 #include "include/conf.h"
+#include "include/defs.h"
 
-void dansguardian_report(void)
+static void show_ignored_dansguardian(FILE *fp_ou,int count)
 {
+       char ignored[80];
+
+       snprintf(ignored,sizeof(ignored),ngettext("%d more dansguardian entry not shown here…","%d more dansguardian entries not shown here…",count),count);
+       fprintf(fp_ou,"<tr><td class=\"data\"></td><td class=\"data\"></td><td class=\"data\"></td><td class=\"data2 more\">%s</td><td class=\"data\"></td></tr>\n",ignored);
+}
 
-   FILE *fp_in = NULL, *fp_ou = NULL;
-      
-   char url[MAXLEN];
-   char dansguardian_in[MAXLEN];
-   char per[MAXLEN];
-   char report[MAXLEN];
-   char period[100];
-   char ip[MAXLEN];
-   char rule[255];
-   char oip[MAXLEN];
-   char user[MAXLEN];
-   char ouser[MAXLEN];
-   char date[15];
-   char date2[15];
-   char hour[15];
-   char *str;
-   int  z=0;
-   int  count=0;
-
-   ouser[0]='\0';
-
-   sprintf(dansguardian_in,"%s/dansguardian.log",tmp);
-   if(!dansguardian_count) {
-      unlink(dansguardian_in);
-      return;
-   }
-
-   sprintf(per,"%s/sarg-period",dirname);
-   sprintf(report,"%s/dansguardian.html",dirname);
-
-   if ((fp_in = fopen(per, "r")) == 0) {
-      fprintf(stderr, "SARG: (dansguardian_report) %s: %s\n",text[45],per);
-      exit(1);
-   }
-
-   fgets(period,sizeof(period),fp_in);
-   fclose(fp_in);
-
-#if defined(HAVE_FOPEN64)
-   if((fp_in=fopen64(dansguardian_in,"r"))==NULL) {
-#else
-   if((fp_in=fopen(dansguardian_in,"r"))==NULL) {
-#endif
-     fprintf(stderr, "SARG: (dansguardian_report) %s: %s\n",text[8],dansguardian_in);
-     exit(1);
-   }
-
-#if defined(HAVE_FOPEN64)
-   if((fp_ou=fopen64(report,"w"))==NULL) {
-#else
-   if((fp_ou=fopen(report,"w"))==NULL) {
-#endif
-     fprintf(stderr, "SARG: (dansguardian_report) %s: %s\n",text[8],report);
-     exit(1);
-   }
-
-   fprintf(fp_ou, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
-   css(fp_ou);
-   fputs("</head>\n",fp_ou);
-   if(strlen(FontFace) > 0) fprintf(fp_ou,"<font face=%s>\n",FontFace);
-   fprintf(fp_ou,"<body bgcolor=%s text=%s background='%s'>\n",BgColor,TxColor,BgImage);
-   if(strlen(LogoImage) > 0) fprintf(fp_ou, "<center><table cellpadding=\"0\" cellspacing=\"0\">\n<tr><th class=\"logo\"><img src='%s' border=0 align=absmiddle width=%s height=%s>&nbsp;%s</th></tr>\n<tr><td height=\"5\"></td></tr>\n</table>\n",LogoImage,Width,Height,LogoText);
-   
-   if(strcmp(IndexTree,"date") == 0)
-      show_sarg(fp_ou, "../../..");
-   else
-      show_sarg(fp_ou,"..");
-   fputs("<center><table cellpadding=0 cellspacing=0>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"title\">%s</th></tr>\n",Title);
-
-   fprintf(fp_ou,"<tr><td class=\"header\">%s: %s</td></tr>\n",text[89],period);
-   fprintf(fp_ou,"<tr><th class=\"header3\">%s</th></tr>\n",text[128]);
-   fputs("</table></center>\n",fp_ou);
-
-   fputs("<center><table cellpadding=1 cellspacing=2>\n",fp_ou);
-   fputs("<tr><td></td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header\">%s</th><th class=\"header\">%s</th><th class=\"header\">%s</th><th class=\"header\">%s</th><th class=\"header\">%s</th></tr>\n",text[98],text[111],text[110],text[91],text[129]);
-
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      if (getword(user,sizeof(user),buf,' ')<0 || getword(date2,sizeof(date2),buf,' ')<0 ||
-          getword(hour,sizeof(hour),buf,' ')<0 || getword(ip,sizeof(ip),buf,' ')<0 ||
-          getword(url,sizeof(url),buf,' ')<0 || getword(rule,sizeof(rule),buf,'\n')<0) {
-         printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",dansguardian_in);
-         exit(1);
-      }
-
-      if(strcmp(UserIp,"yes") == 0)
-           strcpy(user,ip);
-
-      bzero(date, 15);
-      if(strncmp(df,"u",1) != 0) {
-         strncpy(date,date2+6,2);
-         strcat(date,"/");
-         strncat(date,date2+4,2);
-         strcat(date,"/");
-         strncat(date,date2,4);
-      } else {
-         strncpy(date,date2+4,2);
-         strcat(date,"/");
-         strncat(date,date2+6,2);
-         strcat(date,"/");
-         strncat(date,date2,4);
-      }
-
-      if((str=(char *) strstr(user, "_")) != (char *) NULL ) {
-         if((str=(char *) strstr(str+1, "_")) != (char *) NULL )
-            fixip(user);
-      }
-
-      if(strcmp(Ip2Name,"yes") == 0) 
-         ip2name(ip,sizeof(ip));
-
-      if(!z) {
-         strcpy(ouser,user);
-         strcpy(oip,ip);
-         z++;
-      } else {
-         if(strcmp(ouser,user) == 0)
-            user[0]='\0';
-         if(user[0] != '\0')
-            strcpy(ouser,user);
-         if(strcmp(oip,ip) == 0) 
-            ip[0]='\0';
-         if(ip[0] != '\0')
-            strcpy(oip,ip);
-      }
-
-      if(UserTabFile[0] != '\0') {
-         sprintf(warea,":%s:",user);
-         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,user);
-      } else strcpy(name,user);
-
-      if(dotinuser && strstr(name,"_")) {
-         str2=(char *)subs(name,"_",".");
-         strcpy(name,str2);
-      }
-
-     if(DansGuardianReportLimit) {
-         if(strcmp(ouser2,name) == 0) {
-            count++;
-         } else {
-            count=1;
-            strcpy(ouser2,name);
-         }
-         if(count >= DansGuardianReportLimit)
-            continue;
-      }
-
-      fprintf(fp_ou,"<tr><td class=\"data2\" nospaw>%s</td><td class=\"data2\" nospaw>%s</td><td class=\"data2\" nospaw>%s-%s</td><td class=\"data2\" nospaw><a href=\"http://%s\">%s</a></td><td class=\"data2\" nospaw>%s</td></tr>\n",name,ip,date,hour,url,url,rule);
-   }
-
-   fputs("</table>\n",fp_ou);
-
-   show_info(fp_ou);
-   
-   fputs("</body>\n</html>\n",fp_ou);
-
-   fclose(fp_in);
-   fclose(fp_ou);
-
-   unlink(dansguardian_in);
-
-   return;
+void dansguardian_report(void)
+{
+       FILE *fp_in = NULL, *fp_ou = NULL;
+
+       char buf[MAXLEN];
+       char *url;
+       char dansguardian_in[MAXLEN];
+       char report[MAXLEN];
+       char ip[MAXLEN];
+       char rule[255];
+       char oip[MAXLEN];
+       char user[MAXLEN];
+       char ouser[MAXLEN];
+       char date[15];
+       char date2[15];
+       char hour[15];
+       char ouser2[255];
+       int  z=0;
+       int  count=0;
+       struct getwordstruct gwarea;
+
+       ouser[0]='\0';
+
+       snprintf(dansguardian_in,sizeof(dansguardian_in),"%s/dansguardian.int_log",tmp);
+       if(!dansguardian_count) {
+               if (!KeepTempLog && unlink(dansguardian_in))
+                       debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),dansguardian_in,strerror(errno));
+               if (debugz>=LogLevel_Process) debugaz(__FILE__,__LINE__,_("Dansguardian report not generated because it is empty\n"));
+               return;
+       }
+
+       sprintf(report,"%s/dansguardian.html",outdirname);
+
+       if((fp_in=MY_FOPEN(dansguardian_in,"r"))==NULL) {
+               debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),dansguardian_in,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
+               debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),report,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("DansGuardian"),HTML_JS_NONE);
+       fputs("<tr><td class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("DansGuardian"));
+       close_html_header(fp_ou);
+
+       fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\">\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"),_("CAUSE"));
+
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(user,sizeof(user),&gwarea,'\t')<0 || getword(date2,sizeof(date2),&gwarea,'\t')<0 ||
+                   getword(hour,sizeof(hour),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(__FILE__,__LINE__,_("Invalid record in file \"%s\"\n"),dansguardian_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                       debuga(__FILE__,__LINE__,_("Invalid url in file \"%s\"\n"),dansguardian_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(rule,sizeof(rule),&gwarea,'\n')<0) {
+                       debuga(__FILE__,__LINE__,_("Invalid rule in file \"%s\"\n"),dansguardian_in);
+                       exit(EXIT_FAILURE);
+               }
+
+               if(UserIp)
+                       strcpy(user,ip);
+
+               memset(date,0,sizeof(date));
+               if (df!='u') {
+                       strncpy(date,date2+6,2);
+                       strcat(date,"/");
+                       strncat(date,date2+4,2);
+                       strcat(date,"/");
+                       strncat(date,date2,4);
+               } else {
+                       strncpy(date,date2+4,2);
+                       strcat(date,"/");
+                       strncat(date,date2+6,2);
+                       strcat(date,"/");
+                       strncat(date,date2,4);
+               }
+
+               if(Ip2Name)
+                       ip2name(ip,sizeof(ip));
+
+               if(!z) {
+                       strcpy(ouser,user);
+                       strcpy(oip,ip);
+                       z++;
+               } else {
+                       if(strcmp(ouser,user) == 0)
+                               user[0]='\0';
+                       if(user[0] != '\0')
+                               strcpy(ouser,user);
+                       if(strcmp(oip,ip) == 0)
+                               ip[0]='\0';
+                       if(ip[0] != '\0')
+                               strcpy(oip,ip);
+               }
+
+               user_find(name, sizeof(name), user);
+
+               if(DansGuardianReportLimit) {
+                       if(strcmp(ouser2,name) == 0) {
+                               count++;
+                       } else {
+                               if(count>DansGuardianReportLimit && DansGuardianReportLimit>0)
+                                       show_ignored_dansguardian(fp_ou,count-DansGuardianReportLimit);
+                               count=1;
+                               strcpy(ouser2,name);
+                       }
+                       if(count > DansGuardianReportLimit)
+                               continue;
+               }
+
+               fprintf(fp_ou,"<tr><td class=\"data2\">%s</td><td class=\"data2\">%s</td><td class=\"data2\">%s-%s</td><td class=\"data2\">",name,ip,date,hour);
+               output_html_link(fp_ou,url,100);
+               fprintf(fp_ou,"</td><td class=\"data2\">%s</td></tr>\n",rule);
+       }
+       if (fclose(fp_in)==EOF) {
+               debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),dansguardian_in,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if(count>DansGuardianReportLimit && DansGuardianReportLimit>0)
+               show_ignored_dansguardian(fp_ou,count-DansGuardianReportLimit);
+
+       fputs("</table></div>\n",fp_ou);
+       write_html_trailer(fp_ou);
+       if (fclose(fp_ou)==EOF) {
+               debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),report,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if (!KeepTempLog && unlink(dansguardian_in)) {
+               debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),dansguardian_in,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       return;
 }