]>
Commit | Line | Data |
---|---|---|
25697a35 | 1 | /* |
94ff9470 | 2 | * SARG Squid Analysis Report Generator http://sarg.sourceforge.net |
1164c474 | 3 | * 1998, 2010 |
25697a35 GS |
4 | * |
5 | * SARG donations: | |
6 | * please look at http://sarg.sourceforge.net/donations.php | |
1164c474 FM |
7 | * Support: |
8 | * http://sourceforge.net/projects/sarg/forums/forum/363374 | |
25697a35 GS |
9 | * --------------------------------------------------------------------- |
10 | * | |
11 | * This program is free software; you can redistribute it and/or modify | |
12 | * it under the terms of the GNU General Public License as published by | |
13 | * the Free Software Foundation; either version 2 of the License, or | |
14 | * (at your option) any later version. | |
15 | * | |
16 | * This program is distributed in the hope that it will be useful, | |
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 | * GNU General Public License for more details. | |
20 | * | |
21 | * You should have received a copy of the GNU General Public License | |
22 | * along with this program; if not, write to the Free Software | |
23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. | |
24 | * | |
25 | */ | |
26 | ||
27 | #include "include/conf.h" | |
5f3cfd1d | 28 | #include "include/defs.h" |
25697a35 | 29 | |
32e71fa4 | 30 | void smartfilter_report(void) |
25697a35 GS |
31 | { |
32 | ||
33 | FILE *fp_in = NULL, *fp_ou = NULL, *fp_user = NULL; | |
120d768c | 34 | |
06b39c87 | 35 | char buf[MAXLEN]; |
25697a35 | 36 | char url[MAXLEN]; |
25697a35 GS |
37 | char csort[255]; |
38 | char smart_in[MAXLEN]; | |
39 | char smart_ou[MAXLEN]; | |
25697a35 GS |
40 | char sites[MAXLEN]; |
41 | char report[MAXLEN]; | |
25697a35 GS |
42 | char ip[MAXLEN]; |
43 | char user[MAXLEN]; | |
44 | char ouser[MAXLEN]; | |
45 | char data[15]; | |
46 | char hora[15]; | |
47 | char smartcat[256]; | |
48 | char smartheader[15]; | |
49 | char ftime[128]; | |
50 | char smartuser[MAXLEN]; | |
25697a35 | 51 | int fuser=0; |
456d78a5 | 52 | int cstatus; |
9c7c6346 | 53 | struct getwordstruct gwarea; |
f2ec8c75 | 54 | const struct userinfostruct *uinfo; |
25697a35 GS |
55 | |
56 | ouser[0]='\0'; | |
57 | ||
d574e592 | 58 | strcpy(smartheader,_("SmartFilter")); |
25697a35 GS |
59 | strup(smartheader); |
60 | ||
d5d021c5 FM |
61 | sprintf(smart_in,"%s/smartfilter.unsort",outdirname); |
62 | sprintf(sites,"%s/sarg-sites",outdirname); | |
63 | sprintf(smart_ou,"%s/smartfilter.log",outdirname); | |
d5d021c5 | 64 | sprintf(report,"%s/smartfilter.html",outdirname); |
25697a35 | 65 | |
05b90947 | 66 | if (snprintf(csort,sizeof(csort),"sort -n -k 1,1 -k 2,2 -k 3,3 -o \"%s\" \"%s\"",smart_ou,smart_in)>=sizeof(csort)) { |
10210234 | 67 | debuga(_("cannot build the sort command to sort file %s\n"),smart_in); |
06b39c87 | 68 | exit(EXIT_FAILURE); |
05b90947 | 69 | } |
456d78a5 FM |
70 | cstatus=system(csort); |
71 | if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { | |
10210234 FM |
72 | debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus)); |
73 | debuga(_("sort command: %s\n"),csort); | |
06b39c87 | 74 | exit(EXIT_FAILURE); |
456d78a5 | 75 | } |
25697a35 | 76 | if((fp_in=fopen(smart_ou,"r"))==NULL) { |
d574e592 | 77 | debuga(_("(smartfilter) Cannot open log file %s\n"),smart_ou); |
10210234 | 78 | debuga(_("sort command: %s\n"),csort); |
06b39c87 | 79 | exit(EXIT_FAILURE); |
25697a35 | 80 | } |
456d78a5 | 81 | unlink(smart_in); |
25697a35 GS |
82 | |
83 | if((fp_ou=fopen(report,"w"))==NULL) { | |
d574e592 | 84 | debuga(_("(smartfilter) Cannot open log file %s\n"),report); |
06b39c87 | 85 | exit(EXIT_FAILURE); |
25697a35 GS |
86 | } |
87 | ||
d6e703cc | 88 | 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); |
25697a35 | 89 | fputs("</head>\n",fp_ou); |
d6e703cc | 90 | if(strlen(FontFace) > 0) fprintf(fp_ou,"<font face=%s>\n",FontFace); |
dfb337be FM |
91 | fprintf(fp_ou,"<body bgcolor=\"%s\" text=\"%s\" background=\"%s\">\n",BgColor,TxColor,BgImage); |
92 | fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_ou); | |
93 | write_logo_image(fp_ou); | |
25697a35 | 94 | |
dfb337be | 95 | fprintf(fp_ou,"<tr><th align=\"center\"><b><font color=\"%s\" size=\"+1\">%s</font></b></th></tr>\n",TiColor,Title); |
fd46f082 FM |
96 | fprintf(fp_ou,"<tr><td align=\"center\" bgcolor=\"%s\"><font size=\"%s\">",HeaderBgColor,FontSize); |
97 | fprintf(fp_ou,_("Period: %s"),period.html); | |
98 | fputs("</font></td></tr>\n",fp_ou); | |
c36c7384 | 99 | fprintf(fp_ou,"<tr><th bgcolor=\"%s\" align=\"center\"><font size=\"%s\">%s</font></th></tr>\n",HeaderBgColor,FontSize,_("SmartFilter")); |
dfb337be | 100 | fputs("</table></div>\n",fp_ou); |
25697a35 | 101 | |
dfb337be | 102 | fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou); |
25697a35 GS |
103 | fputs("<tr><td></td></tr>\n",fp_ou); |
104 | fputs("<tr><td></td></tr>\n",fp_ou); | |
105 | fputs("<tr><td></td></tr>\n",fp_ou); | |
c36c7384 | 106 | fprintf(fp_ou,"<tr><th bgcolor=%s><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th></tr>\n",HeaderBgColor,FontSize,_("USERID"),HeaderBgColor,FontSize,_("IP/NAME"),HeaderBgColor,FontSize,_("DATE/TIME"),HeaderBgColor,FontSize,_("ACCESSED SITE"),HeaderBgColor,FontSize,smartheader); |
25697a35 GS |
107 | |
108 | while(fgets(buf,sizeof(buf),fp_in)!=NULL) { | |
9c7c6346 FM |
109 | getword_start(&gwarea,buf); |
110 | if (getword(user,sizeof(user),&gwarea,'\t')<0 || getword(data,sizeof(data),&gwarea,'\t')<0 || | |
111 | getword(hora,sizeof(hora),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0 || | |
112 | getword(url,sizeof(url),&gwarea,'\t')<0 || getword(smartcat,sizeof(smartcat),&gwarea,'\n')<0) { | |
10210234 | 113 | debuga(_("There is a broken record or garbage in file %s\n"),smart_ou); |
06b39c87 | 114 | exit(EXIT_FAILURE); |
4bcb77cf | 115 | } |
25697a35 | 116 | |
f2ec8c75 FM |
117 | uinfo=userinfo_find_from_id(user); |
118 | if (!uinfo) { | |
10210234 | 119 | debuga(_("Unknown user ID %s in file %s\n"),user,smart_ou); |
06b39c87 | 120 | exit(EXIT_FAILURE); |
25697a35 | 121 | } |
25697a35 GS |
122 | if(strcmp(ouser,user) != 0) { |
123 | strcpy(ouser,user); | |
d5d021c5 | 124 | sprintf(smartuser,"%s/denied_%s.html",outdirname,uinfo->filename); |
25697a35 GS |
125 | if(fuser) { |
126 | fuser=0; | |
127 | fputs("</table>\n",fp_user); | |
e6414a9d | 128 | if(ShowSargInfo) { |
120d768c | 129 | zdate(ftime, sizeof(ftime), DateFormat); |
c36c7384 | 130 | fprintf(fp_user,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime); |
354c1a68 | 131 | } |
25697a35 GS |
132 | fputs("</body>\n</html>\n",fp_user); |
133 | fclose(fp_user); | |
134 | } | |
135 | if ((fp_user = fopen(smartuser, "a")) == 0) { | |
d574e592 | 136 | debuga(_("(smartfilter) Cannot open file %s\n"),smartuser); |
06b39c87 | 137 | exit(EXIT_FAILURE); |
25697a35 GS |
138 | } |
139 | fuser=1; | |
140 | ||
141 | fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"",fp_ou); | |
142 | fputs(" \"http://www.w3.org/TR/html4/loose.dtd\">\n",fp_ou); | |
143 | fputs("<html>\n",fp_user); | |
144 | fputs("<head>\n",fp_user); | |
354c1a68 | 145 | fprintf(fp_user," <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet); |
25697a35 GS |
146 | fputs("</head>\n",fp_user); |
147 | ||
120d768c | 148 | if(FontFace[0] != 0) { |
354c1a68 FM |
149 | /* |
150 | Before merging the sprintf and the fputs, the code looked like this: | |
25697a35 GS |
151 | sprintf(html2,"<font face=%s>\n",FontFace); |
152 | fputs(url,fp_user); | |
354c1a68 FM |
153 | The two lines don't use the same buffer so the string formated by sprintf is not the string |
154 | written to fp_user. I (fmarchal) assumed it was a typo and replaced it by a fprintf but | |
155 | that font tag is not valid outside of the body. So, the generated html was likely | |
156 | containing garbage not rendered by the browser. | |
157 | */ | |
158 | fprintf(fp_user,"<font face=%s>\n",FontFace); | |
25697a35 | 159 | } |
dfb337be FM |
160 | fprintf(fp_user,"<body bgcolor=\"%s\" text=\"%s\" background=\"%s\">\n",BgColor,TxColor,BgImage); |
161 | fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_user); | |
162 | if(LogoImage[0]!='\0') fprintf(fp_user,"<tr><th align=left><img src=\"%s\" border=\"0\" align=\"absmiddle\" width=\"%s\" height=\"%s\"><font color=\"%s\">%s</font>\n",LogoImage,Width,Height,LogoTextColor,LogoText); | |
163 | fprintf(fp_user,"<tr><th align=\"center\"><b><font color=\"%s\" size=\"+1\">%s</font></b></th></tr>\n",TiColor,Title); | |
fa6552b0 | 164 | fputs("<tr><td align=center bgcolor=\"%s\"><font size=\"%s\">",fp_user); |
fd46f082 | 165 | fprintf(fp_user,_("Period: %s"),period.html); |
fa6552b0 | 166 | fputs("</font></td></tr>\n",fp_user); |
c36c7384 | 167 | fprintf(fp_user,"<tr><td align=\"center\" bgcolor=\"%s\"><font size=\"%s\">%s:</font><font size=\"%s\"> %s</font></td></tr>\n",HeaderBgColor,FontSize,_("User"),FontSize,uinfo->label); |
dfb337be FM |
168 | fputs("</table></div>\n",fp_user); |
169 | fputs("<div align=\"center\"><table cellpadding=0 cellspacing=2>\n",fp_user); | |
25697a35 GS |
170 | fputs("<tr><td></td></tr>\n",fp_user); |
171 | fputs("<tr><td></td></tr>\n",fp_user); | |
172 | fputs("<tr><td></td></tr>\n",fp_user); | |
c36c7384 | 173 | fprintf(fp_user,"<tr><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th></tr>\n",HeaderBgColor,FontSize,_("USERID"),HeaderBgColor,FontSize,_("IP/NAME"),HeaderBgColor,FontSize,_("DATE/TIME"),HeaderBgColor,FontSize,_("ACCESSED SITE"),HeaderBgColor,FontSize,smartheader); |
25697a35 | 174 | } |
f2ec8c75 | 175 | fprintf(fp_user,"<tr><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s-%s</font></td><td bgcolor=%s><font size=%s>%s</font></td><td bgcolor=%s><font size=%s>%s</font></td></th>\n",TxBgColor,FontSize,uinfo->label,TxBgColor,FontSize,ip,TxBgColor,FontSize,data,hora,TxBgColor,FontSize,url,TxBgColor,FontSize,smartcat); |
25697a35 | 176 | |
f2ec8c75 | 177 | fprintf(fp_ou,"<tr><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s-%s</font></td><td bgcolor=%s><font size=%s>%s</font></td><td bgcolor=%s><font size=%s>%s</font></td></th>\n",TxBgColor,FontSize,uinfo->label,TxBgColor,FontSize,ip,TxBgColor,FontSize,data,hora,TxBgColor,FontSize,url,TxBgColor,FontSize,smartcat); |
25697a35 GS |
178 | } |
179 | ||
180 | fputs("</table>\n",fp_ou); | |
181 | ||
e6414a9d | 182 | if(ShowSargInfo) { |
120d768c | 183 | zdate(ftime, sizeof(ftime), DateFormat); |
c36c7384 | 184 | fprintf(fp_ou,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime); |
25697a35 GS |
185 | } |
186 | ||
187 | fputs("</body>\n</html>\n",fp_user); | |
188 | ||
189 | fclose(fp_ou); | |
190 | if(fp_user) { | |
191 | fputs("</table>\n",fp_user); | |
e6414a9d | 192 | if(ShowSargInfo) { |
120d768c | 193 | zdate(ftime, sizeof(ftime), DateFormat); |
c36c7384 | 194 | fprintf(fp_user,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime); |
25697a35 GS |
195 | } |
196 | fputs("</body>\n</html>\n",fp_user); | |
197 | fclose(fp_user); | |
198 | } | |
199 | ||
200 | return; | |
201 | } |