]>
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 GS |
29 | |
30 | extern numlist hours; | |
31 | ||
f2ec8c75 | 32 | void report_day(const struct userinfostruct *uinfo) |
25697a35 GS |
33 | { |
34 | ||
35 | FILE *fp_in, *fp_ou; | |
36 | ||
324ba7f3 | 37 | char buf[200]; |
25697a35 | 38 | char data[20]; |
324ba7f3 FM |
39 | long long int hour; |
40 | const char *label; | |
25697a35 | 41 | char arqout[MAXLEN]; |
324ba7f3 FM |
42 | char wdirname[2048]; |
43 | char colsep; | |
d6e703cc | 44 | int ihour=0; |
324ba7f3 FM |
45 | int day,month,year; |
46 | int daylist[MAX_DATETIME_DAYS]; | |
47 | int daysort[MAX_DATETIME_DAYS]; | |
48 | int ndaylist; | |
49 | int daynum; | |
50 | int dayidx; | |
51 | long long int bytes; | |
6e792ade | 52 | long long int elap; |
324ba7f3 FM |
53 | long long int tbytes[MAX_DATETIME_DAYS*24]; |
54 | long long int telap[MAX_DATETIME_DAYS*24]; | |
55 | long long int tt; | |
56 | long long int tttime[24]; | |
57 | int i, j; | |
9c7c6346 | 58 | struct getwordstruct gwarea; |
324ba7f3 FM |
59 | struct tm t; |
60 | ||
61 | snprintf(wdirname,sizeof(wdirname),"%s/%s.day",tmp,uinfo->filename); | |
62 | if(access(wdirname, R_OK) != 0) return; | |
25697a35 | 63 | |
d5d021c5 FM |
64 | if (snprintf(arqout,sizeof(arqout),"%s/%s/d%s.html",outdirname,uinfo->filename,uinfo->filename)>=sizeof(arqout)) { |
65 | debuga(_("Output file name too long: %s/%s/d%s.html\n"),outdirname,uinfo->filename,uinfo->filename); | |
06b39c87 | 66 | exit(EXIT_FAILURE); |
f2ec8c75 | 67 | } |
25697a35 GS |
68 | |
69 | if((fp_in=fopen(wdirname,"r"))==NULL) { | |
06b39c87 FM |
70 | debuga(_("(repday) Cannot open log file %s\n"),wdirname); |
71 | exit(EXIT_FAILURE); | |
25697a35 GS |
72 | } |
73 | ||
324ba7f3 FM |
74 | memset(tbytes,0,sizeof(tbytes)); |
75 | memset(telap,0,sizeof(telap)); | |
76 | ndaylist=0; | |
25697a35 GS |
77 | |
78 | while(fgets(buf,sizeof(buf),fp_in)!=NULL) { | |
9c7c6346 FM |
79 | fixendofline(buf); |
80 | getword_start(&gwarea,buf); | |
81 | if (getword(data,sizeof(data),&gwarea,'\t')<0) { | |
324ba7f3 | 82 | debuga(_("Invalid date in file %s\n"),wdirname); |
06b39c87 | 83 | exit(EXIT_FAILURE); |
4bcb77cf | 84 | } |
324ba7f3 FM |
85 | if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue; |
86 | if (day<1 || day>31 || month<1 || month>12 || year>9999) continue; | |
87 | daynum=(year*10000)+(month*100)+day; | |
88 | for (dayidx=0 ; dayidx<ndaylist && daynum!=daylist[dayidx] ; dayidx++); | |
89 | if (dayidx>=ndaylist) { | |
90 | if (dayidx>=sizeof(daylist)/sizeof(*daylist)) { | |
91 | debuga(_("Too many different dates in %s\n"),wdirname); | |
92 | exit(EXIT_FAILURE); | |
93 | } | |
94 | daylist[ndaylist++]=daynum; | |
25697a35 GS |
95 | } |
96 | ||
324ba7f3 FM |
97 | if (getword_atoll(&hour,&gwarea,'\t')<0) { |
98 | debuga(_("Invalid time in file %s\n"),wdirname); | |
06b39c87 | 99 | exit(EXIT_FAILURE); |
f2ec8c75 | 100 | } |
324ba7f3 FM |
101 | ihour=(int)hour; |
102 | i=dayidx*24+ihour; | |
103 | ||
104 | if ((datetimeby & DATETIME_BYTE)!=0) { | |
105 | colsep=((datetimeby & DATETIME_ELAP)!=0) ? '\t' : '\0'; | |
106 | if (getword_atoll(&bytes,&gwarea,colsep)<0) { | |
107 | debuga(_("Invalid number of bytes in file %s\n"),wdirname); | |
108 | exit(EXIT_FAILURE); | |
109 | } | |
110 | tbytes[i]+=bytes; | |
111 | } | |
112 | if ((datetimeby & DATETIME_ELAP)!=0) { | |
113 | if (getword_atoll(&elap,&gwarea,'\0')<0) { | |
114 | debuga(_("Invalid elapsed time in file %s\n"),wdirname); | |
115 | exit(EXIT_FAILURE); | |
116 | } | |
117 | telap[i]+=elap; | |
4bcb77cf | 118 | } |
324ba7f3 FM |
119 | } |
120 | fclose(fp_in); | |
25697a35 | 121 | |
324ba7f3 FM |
122 | if((fp_ou=fopen(arqout,"w"))==NULL) { |
123 | debuga(_("(repday) Cannot open log file %s\n"),arqout); | |
124 | exit(EXIT_FAILURE); | |
125 | } | |
dfb337be | 126 | |
2e96438d | 127 | write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("Day report"),HTML_JS_NONE); |
324ba7f3 FM |
128 | fprintf(fp_ou,"<tr><td class=\"header_c\" colspan=\"2\">%s: %s</td></tr>\n",_("Period"),period.html); |
129 | fprintf(fp_ou,"<tr><th class=\"header_c\" colspan=\"2\">%s: %s</th></tr>\n",_("User"),uinfo->label); | |
130 | close_html_header(fp_ou); | |
dfb337be | 131 | |
324ba7f3 FM |
132 | dayidx=0; |
133 | for (i=0 ; i<ndaylist ; i++) { | |
134 | daynum=daylist[i]; | |
135 | for (j=dayidx ; j>0 && daynum<daylist[daysort[j-1]] ; j--) daysort[j]=daysort[j-1]; | |
136 | daysort[j]=i; | |
137 | dayidx++; | |
138 | } | |
dfb337be | 139 | |
324ba7f3 FM |
140 | if((datetimeby & DATETIME_BYTE)!=0) { |
141 | label=_("BYTES"); | |
142 | fputs("<table class=\"report\" cellpadding=\"0\" cellspacing=\"2\">\n", fp_ou); | |
143 | fputs("<tr><th class=\"header_c\"></th>",fp_ou); | |
144 | for( i = 0; i < hours.len; i++ ) | |
145 | fprintf(fp_ou, "<td class=\"header_c\">%02d%s<br>%s</td>\n", hours.list[ i ], _("H"), label ); | |
146 | fprintf(fp_ou, "<td class=\"header_c\">%s<br>%s</td></tr>\n", _("TOTAL"), label ); | |
147 | ||
148 | memset(tttime,0,sizeof(tttime)); | |
149 | for (dayidx=0 ; dayidx<ndaylist ; dayidx++) { | |
150 | daynum=daysort[dayidx]; | |
151 | day=daylist[daynum]%100; | |
152 | month=(daylist[daynum]/100)%100; | |
153 | year=daylist[daynum]/10000; | |
154 | computedate(year,month,day,&t); | |
155 | strftime(data,sizeof(data),"%x",&t); | |
156 | fprintf(fp_ou, "<tr><td class=\"data\">%s</td>\n", data ); | |
25697a35 | 157 | tt=0; |
324ba7f3 FM |
158 | for( i = 0; i < hours.len; i++ ) { |
159 | ihour=hours.list[i]; | |
160 | if (tbytes[daynum*24+ihour]>0) { | |
161 | fprintf(fp_ou, "<td class=\"data\">%s</td>\n",fixnum(tbytes[daynum*24+ihour],1)); | |
162 | tt+=tbytes[daynum*24+ihour]; | |
163 | tttime[ihour]+=tbytes[daynum*24+ihour]; | |
164 | } else | |
165 | fputs("<td class=\"data\"></td>\n",fp_ou); | |
166 | } | |
167 | fprintf(fp_ou, "<td class=\"data\">%s</td></tr>\n",fixnum(tt,1)); | |
25697a35 GS |
168 | } |
169 | ||
324ba7f3 FM |
170 | fprintf(fp_ou, "<tr><td class=\"header_l\">%s</td>\n", _("TOTAL") ); |
171 | tt=0; | |
172 | for( i = 0; i < hours.len; i++ ) { | |
173 | if (tttime[i]>0) { | |
174 | fprintf(fp_ou, "<td class=\"header_r\">%s</td>\n",fixnum(tttime[i],1)); | |
175 | tt+=tttime[i]; | |
176 | } else | |
177 | fputs("<td class=\"header_r\"></td>\n",fp_ou); | |
178 | } | |
179 | fprintf(fp_ou, "<td class=\"header_r\">%s</td></tr>\n",fixnum(tt,1)); | |
180 | fputs("</table>\n",fp_ou); | |
25697a35 | 181 | } |
dfb337be | 182 | |
324ba7f3 FM |
183 | if((datetimeby & DATETIME_ELAP)!=0) { |
184 | label=_("H:M:S"); | |
185 | fputs("<table class=\"report\" cellpadding=\"0\" cellspacing=\"2\">\n", fp_ou); | |
186 | fputs("<tr><th class=\"header_c\"></th>",fp_ou); | |
187 | for( i = 0; i < hours.len; i++ ) | |
188 | fprintf(fp_ou, "<td class=\"header_c\">%02d%s<br>%s</td>\n", hours.list[ i ], _("H"), label ); | |
189 | fprintf(fp_ou, "<td class=\"header_c\">%s<br>%s</td></tr>\n", _("TOTAL"), label ); | |
190 | ||
191 | memset(tttime,0,sizeof(tttime)); | |
192 | for (dayidx=0 ; dayidx<ndaylist ; dayidx++) { | |
193 | daynum=daysort[dayidx]; | |
194 | day=daylist[daynum]%100; | |
195 | month=(daylist[daynum]/100)%100; | |
196 | year=daylist[daynum]/10000; | |
197 | computedate(year,month,day,&t); | |
198 | strftime(data,sizeof(data),"%x",&t); | |
199 | fprintf(fp_ou, "<tr><td class=\"data\">%s</td>\n", data ); | |
200 | tt=0; | |
201 | for( i = 0; i < hours.len; i++ ) { | |
202 | ihour=hours.list[i]; | |
203 | if (telap[daynum*24+ihour]>0) { | |
204 | fprintf(fp_ou, "<td class=\"data\">%s</td>\n",fixtime(telap[daynum*24+ihour])); | |
205 | tt+=telap[daynum*24+ihour]; | |
206 | tttime[ihour]+=telap[daynum*24+ihour]; | |
207 | } else | |
208 | fputs("<td class=\"data\"></td>\n",fp_ou); | |
209 | } | |
210 | fprintf(fp_ou, "<td class=\"data\">%s</td></tr>\n",fixtime(tt)); | |
211 | } | |
25697a35 | 212 | |
324ba7f3 FM |
213 | fprintf(fp_ou, "<tr><td class=\"header_l\">%s</td>\n", _("TOTAL") ); |
214 | tt=0; | |
215 | for( i = 0; i < hours.len; i++ ) { | |
216 | if (tttime[i]>0) { | |
217 | fprintf(fp_ou, "<td class=\"header_r\">%s</td>\n",fixtime(tttime[i])); | |
218 | tt+=tttime[i]; | |
219 | } else | |
220 | fputs("<td class=\"header_r\"></td>\n",fp_ou); | |
221 | } | |
222 | fprintf(fp_ou, "<td class=\"header_r\">%s</td></tr>\n",fixtime(tt)); | |
223 | fputs("</table>\n",fp_ou); | |
224 | } | |
25697a35 | 225 | |
fa6552b0 FM |
226 | if (write_html_trailer(fp_ou)<0) |
227 | debuga(_("Write error in file %s\n"),arqout); | |
228 | if (fclose(fp_ou)==EOF) | |
229 | debuga(_("Failed to close file %s - %s\n"),arqout,strerror(errno)); | |
25697a35 GS |
230 | return; |
231 | } |