]> git.ipfire.org Git - thirdparty/sarg.git/blob - grepday.c
Give a try to splint and apply a few of the recommandations
[thirdparty/sarg.git] / grepday.c
1 /*
2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
3 * 1998, 2010
4 *
5 * SARG donations:
6 * please look at http://sarg.sourceforge.net/donations.php
7 * Support:
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
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"
28 #include "include/defs.h"
29
30 #if defined(HAVE_GD)
31
32 static int blue;
33 static int white;
34 static int lavender;
35 static int darkblue;
36 static int dimgray;
37 static int goldenrod;
38 static int goldenrod2;
39 static int gray;
40 static int silver;
41 static int black;
42
43 #if defined(HAVE_ICONV_H) && defined(gdFTEX_Unicode)
44 #include <iconv.h>
45 #define SARGgdImageStringFT I18NgdImageStringFT
46
47 static char * I18NgdImageStringFT (gdImage * im, int *brect, int fg, char *fontlist,
48 double ptsize, double angle, int x, int y, char *string)
49 {
50 iconv_t localtoutf;
51 char *sstring, *str, *sstr, *retval;
52 size_t slen, sslen;
53
54 slen = strlen(string) + 1; // We must include string termination character
55 sslen = slen * 2; // We assume that UTF8 maximum 2 times large than local
56 sstring = (char *)malloc(sslen);
57 if (!sstring) {
58 debuga(_("malloc error (%zu bytes required)\n"),sslen);
59 exit(EXIT_FAILURE);
60 }
61
62 str = (char *) string;
63 sstr = (char *) sstring;
64
65 localtoutf = iconv_open ("UTF-8", CharSet);
66 if (localtoutf==(iconv_t)-1) {
67 debuga(_("(grepday) iconv cannot convert from %s to UTF-8 - %s\n"),CharSet,strerror(errno));
68 strcpy(sstring,string); //show something sensible on the graph
69 }
70 else {
71 if (iconv (localtoutf, (ICONV_CONST char **)&str, &slen, &sstr, &sslen)==-1) {
72 debuga(_("(grepday) iconv failed to convert string \"%s\" from %s to UTF-8 - %s\n"),string,CharSet,strerror(errno));
73 strcpy(sstring,string); //show something sensible on the graph
74 }
75 iconv_close (localtoutf);
76 }
77
78 retval = gdImageStringFTEx (im, brect, fg, fontlist, ptsize, angle, x, y, sstring, gdFTEX_Unicode);
79 free(sstring);
80
81 return retval;
82 }
83 #else
84 #define SARGgdImageStringFT gdImageStringFT
85 #endif
86
87 static void bar(int x1,long long int n)
88 {
89 gdPoint points[4];
90 int brect[8];
91 int val=0, x;
92 long long int num;
93 char v[15];
94
95 static const long long int limits[400]={0,500,1000,2000,3000,4000,
96 5000,6000,7000,8000,9000,10000,
97 20000,30000,40000,50000,70000,90000,
98 110000,130000,150000,170000,190000,210000,
99 230000,250000,280000,310000,340000,370000,
100 400000,430000,450000,460000,490000,500000,
101 550000,600000,650000,700000,750000,800000,
102 850000,900000,950000,1000000,1100000,1200000,
103 1300000,1400000,1500000,1600000,1700000,1800000,
104 1900000,2000000,2100000,2200000,2300000,2400000,
105 2500000,2600000,2700000,2800000,2900000,3000000,
106 3100000,3200000,3300000,3400000,3500000,3600000,
107 3700000,3800000,3900000,4000000,4100000,4200000,
108 4300000,4400000,4500000,4600000,4700000,4800000,
109 4900000,5000000,5100000,5200000,5300000,5400000,
110 5500000,5600000,5700000,5800000,5900000,6000000,
111 6100000,6200000,6300000,6400000,6500000,6600000,
112 6700000,6800000,6900000,7000000,7100000,7200000,
113 7300000,7400000,7500000,7600000,7700000,7800000,
114 7900000,8000000,8100000,8200000,8300000,8400000,
115 8500000,8600000,8700000,8800000,8900000,9000000,
116 9100000,9200000,9300000,9400000,9500000,9600000,
117 9700000,9800000,9900000,10000000,10500000,11000000,
118 11500000,12000000,12500000,13000000,13500000,14000000,
119 14500000,15000000,15500000,16000000,16500000,17000000,
120 17500000,18000000,18500000,19000000,19500000,20000000,
121 21000000,22000000,23000000,24000000,25000000,26000000,
122 27000000,28000000,29000000,30000000,31000000,32000000,
123 33000000,34000000,35000000,36000000,37000000,38000000,
124 39000000,40000000,41000000,42000000,43000000,44000000,
125 45000000,46000000,47000000,48000000,49000000,50000000,
126 51000000,52000000,53000000,54000000,55000000,56000000,
127 57000000,58000000,59000000,60000000,61000000,62000000,
128 63000000,64000000,65000000,66000000,67000000,68000000,
129 69000000,70000000,71000000,72000000,73000000,74000000,
130 75000000,76000000,77000000,78000000,79000000,80000000,
131 81000000,82000000,83000000,84000000,85000000,86000000,
132 87000000,88000000,89000000,90000000,91000000,92000000,
133 93000000,94000000,95000000,96000000,97000000,98000000,
134 99000000,100000000,110000000,120000000,130000000,140000000,
135 150000000,160000000,170000000,180000000,190000000,200000000,
136 210000000,220000000,230000000,240000000,250000000,260000000,
137 270000000,280000000,290000000,300000000,310000000,320000000,
138 330000000,340000000,350000000,360000000,370000000,380000000,
139 390000000,400000000,410000000,420000000,430000000,440000000,
140 450000000,460000000,470000000,480000000,490000000,500000000,
141 510000000,520000000,530000000,540000000,550000000,560000000,
142 570000000,580000000,590000000,600000000,610000000,620000000,
143 630000000,640000000,650000000,660000000,670000000,680000000,
144 690000000,700000000,710000000,720000000,730000000,740000000,
145 750000000,760000000,770000000,780000000,790000000,800000000,
146 810000000,820000000,830000000,840000000,850000000,860000000,
147 870000000,880000000,890000000,900000000,910000000,920000000,
148 930000000,940000000,950000000,960000000,970000000,980000000,
149 990000000LL,1000000000LL,1100000000LL,1200000000LL,1300000000LL,1400000000LL,
150 1500000000LL,1600000000LL,1700000000LL,1800000000LL,1900000000LL,2000000000LL,
151 2100000000LL,2200000000LL,2300000000LL,2400000000LL,2500000000LL,2600000000LL,
152 2700000000LL,2800000000LL,2900000000LL,3000000000LL,3100000000LL,3200000000LL,
153 3300000000LL,3400000000LL,3500000000LL,3600000000LL,3700000000LL,3800000000LL,
154 3900000000LL,4000000000LL,4100000000LL,4200000000LL,4300000000LL,4400000000LL,
155 4500000000LL,4600000000LL,4700000000LL,4800000000LL,4900000000LL,5000000000LL};
156
157 if(strcmp(GraphDaysBytesBarColor,"orange") == 0) {
158 color1 = gdImageColorAllocate(im, 255, 233, 142);
159 color2 = gdImageColorAllocate(im, 220, 163, 72);
160 color3 = gdImageColorAllocate(im, 255, 198, 107);
161 }
162 if(strcmp(GraphDaysBytesBarColor,"blue") == 0) {
163 color1 = gdImageColorAllocate(im, 62, 80, 167);
164 color2 = gdImageColorAllocate(im, 40, 51, 101);
165 color3 = gdImageColorAllocate(im, 57, 73, 150);
166 }
167 if(strcmp(GraphDaysBytesBarColor,"green") == 0) {
168 color1 = gdImageColorAllocate(im,120,166,129);
169 color2 = gdImageColorAllocate(im,84,113,82);
170 color3 = gdImageColorAllocate(im,158,223,167);
171 }
172 if(strcmp(GraphDaysBytesBarColor,"yellow") == 0) {
173 color1 = gdImageColorAllocate(im,185,185,10);
174 color2 = gdImageColorAllocate(im,111,111,10);
175 color3 = gdImageColorAllocate(im,166,166,10);
176 }
177 if(strcmp(GraphDaysBytesBarColor,"brown") == 0) {
178 color1 = gdImageColorAllocate(im,97,45,27);
179 color2 = gdImageColorAllocate(im,60,30,20);
180 color3 = gdImageColorAllocate(im,88,41,26);
181 }
182 if(strcmp(GraphDaysBytesBarColor,"red") == 0){
183 color1 = gdImageColorAllocate(im,185,10,10);
184 color2 = gdImageColorAllocate(im,111,10,10);
185 color3 = gdImageColorAllocate(im,166,10,10);
186 }
187
188 blue = gdImageColorAllocate(im, 0, 0, 255);
189 white = gdImageColorAllocate(im, 255, 255, 255);
190 dimgray = gdImageColorAllocate(im, 105, 105, 105);
191 goldenrod = gdImageColorAllocate(im, 234, 234, 174);
192 goldenrod2 = gdImageColorAllocate(im, 207, 181, 59);
193
194 num = n;
195 val = 55;
196 for(x=0; x<=366; x++) {
197 if(limits[x] >= num) {
198 val = 425 - x;
199 break;
200 }
201 }
202
203 gdImageFilledRectangle(im, x1, val, x1+11, 425, color3);
204
205 points[0].x = x1+7;
206 points[0].y = val-5;
207 points[1].x = x1;
208 points[1].y = val;
209 points[2].x = x1+11;
210 points[2].y = val;
211 points[3].x = x1+17;
212 points[3].y = val-5;
213 gdImageFilledPolygon(im, points, 4, color1);
214
215 gdImageLine(im, x1+8, val-2, x1+8, val-10, dimgray);
216 gdImageFilledRectangle(im, x1-2, val-20, x1+18, val-10, goldenrod);
217 gdImageRectangle(im, x1-2, val-20, x1+18, val-10, goldenrod2);
218
219 snprintf(v,6,"%s",fixnum(num,0));
220
221 SARGgdImageStringFT(im,&brect[0],black,GraphFont,6,0.0,x1-1,val-12,v);
222
223 points[0].x = x1+17;
224 points[0].y = val-5;
225 points[1].x = x1+11;
226 points[1].y = val;
227 points[2].x = x1+11;
228 points[2].y = 426;
229 points[3].x = x1+17;
230 points[3].y = 420;
231 gdImageFilledPolygon(im, points, 4, color2);
232
233 return;
234 }
235 #endif //HAVE_GD
236
237 void greport_day(const struct userinfostruct *uinfo)
238 {
239 #ifdef HAVE_GD
240 FILE *fp_in, *pngout;
241 int x, y;
242 int x1;
243 int brect[8];
244 char wdirname[MAXLEN];
245 char graph[MAXLEN];
246 char buf[MAXLEN];
247 char csort[255];
248 char data[20];
249 char s[15];
250 char tmp5[MAXLEN];
251 int count=0;
252 int oday=0;
253 int day=0;
254 long long int llday;
255 long long int bytes;
256 char ftime[128];
257 long long int tot=0;
258 time_t t;
259 struct tm *local;
260 int cstatus;
261 struct getwordstruct gwarea;
262 struct getwordstruct gwarea1;
263
264 if(!Graphs || GraphFont[0]=='\0') {
265 unlink(wdirname);
266 return;
267 }
268 if(access(GraphFont, R_OK) != 0) {
269 debuga(_("(grepday) Fontname %s not found\n"),GraphFont);
270 exit(EXIT_FAILURE);
271 }
272
273 im = gdImageCreate(720, 480);
274
275 lavender = gdImageColorAllocate(im, 230, 230, 250);
276 white = gdImageColorAllocate(im, 255, 255, 255);
277 gray = gdImageColorAllocate(im, 192, 192, 192);
278 silver = gdImageColorAllocate(im, 211, 211, 211);
279 black = gdImageColorAllocate(im, 0, 0, 0);
280 blue = gdImageColorAllocate(im, 35, 35, 227);
281 dimgray = gdImageColorAllocate(im, 105, 105, 105);
282 darkblue = gdImageColorAllocate(im, 0, 0, 139);
283
284 gdImageRectangle(im, 0, 0, 719, 479, dimgray);
285 gdImageFilledRectangle(im, 60, 60, 700, 420, silver);
286
287 points[0].x = 50;
288 points[0].y = 65;
289 points[1].x = 50;
290 points[1].y = 425;
291 points[2].x = 60;
292 points[2].y = 420;
293 points[3].x = 60;
294 points[3].y = 60;
295 gdImageFilledPolygon(im, points, 4, gray);
296
297 points[0].x = 60;
298 points[0].y = 420;
299 points[1].x = 50;
300 points[1].y = 425;
301 points[2].x = 690;
302 points[2].y = 425;
303 points[3].x = 700;
304 points[3].y = 420;
305 gdImageFilledPolygon(im, points, 4, gray);
306
307 gdImageLine(im, 50, 65, 50, 430, black);
308 gdImageLine(im, 45, 425, 690, 425, black);
309 gdImageLine(im, 50, 425, 60, 420, black);
310 gdImageLine(im, 60, 420, 60, 60, black);
311 gdImageLine(im, 700, 60, 700, 420, black);
312 gdImageLine(im, 690, 425, 700, 420, black);
313
314 for(x=415; x>=65; x=x-10) {
315 gdImageLine(im, 50, x, 60, x-5, dimgray);
316 gdImageLine(im, 47, x, 50, x, dimgray);
317 }
318
319 for(x=60; x<=420; x=x+10)
320 gdImageLine(im, 60, x, 700, x, dimgray);
321
322 gdImageLine(im, 60, 420, 700, 420, black);
323
324 for(x=70; x<=680; x=x+20)
325 gdImageLine(im, x, 425, x, 428, dimgray);
326
327 y=65;
328 for(x=1; x<=31; x++) {
329 sprintf(s,"%02d",x);
330 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,y,437,s);
331 y=y+20;
332 }
333
334 t = time(NULL);
335 local = localtime(&t);
336 if(strcmp(DateFormat,"u") == 0)
337 strftime(ftime, sizeof(ftime), "%b/%d/%Y %H:%M", local);
338 if(strcmp(DateFormat,"e") == 0)
339 strftime(ftime, sizeof(ftime), "%d/%b/%Y-%H:%M", local);
340
341 SARGgdImageStringFT(im,&brect[0],darkblue,GraphFont,7,0.0,620,470,ftime);
342 if(ShowSargInfo) SARGgdImageStringFT(im,&brect[0],darkblue,GraphFont,10,0.0,257,15,"SARG, ");
343 SARGgdImageStringFT(im,&brect[0],darkblue,GraphFont,10,0.0,300,15,Title);
344 sprintf(warea,_("Period: %s"),period);
345 SARGgdImageStringFT(im,&brect[0],darkblue,GraphFont,9,0.0,300,27,warea);
346 sprintf(warea,_("User: %s"),uinfo->label);
347 SARGgdImageStringFT(im,&brect[0],darkblue,GraphFont,9,0.0,300,38,warea);
348 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,418," 50K");
349 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,408,"250K");
350 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,398,"500K");
351 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,388," 1M");
352 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,378," 2M");
353 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,368," 3M");
354 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,358," 4M");
355 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,348," 5M");
356 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,338," 6M");
357 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,328," 7M");
358 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,318," 8M");
359 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,308," 9M");
360 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,298," 10M");
361 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,288," 15M");
362 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,278," 20M");
363 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,268," 30M");
364 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,258," 40M");
365 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,248," 50M");
366 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,238," 60M");
367 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,228," 70M");
368 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,218," 80M");
369 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,208," 90M");
370 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,198,"100M");
371 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,188,"200M");
372 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,178,"300M");
373 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,168,"400M");
374 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,158,"500M");
375 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,148,"600M");
376 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,138,"700M");
377 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,128,"800M");
378 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,118,"900M");
379 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23,108," 1G");
380 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23, 98," 2G");
381 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23, 88," 3G");
382 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23, 78," 4G");
383 SARGgdImageStringFT(im,&brect[0],dimgray,GraphFont,7,0.0,23, 68," 5G");
384 if(strcmp(datetimeby,"bytes") == 0)
385 SARGgdImageStringFT(im,&brect[0],black,GraphFont,10,3.14/2,20,248,_("BYTES"));
386 else
387 SARGgdImageStringFT(im,&brect[0],black,GraphFont,10,3.14/2,20,248,_("ELAPSED TIME"));
388 SARGgdImageStringFT(im,&brect[0],black,GraphFont,10,0.0,330,460,_("DAYS"));
389
390 if (snprintf(graph,sizeof(graph),"%s/%s/graph_day.png",outdirname,uinfo->filename)>=sizeof(graph)) {
391 debuga(_("user name too long for %s/%s/graph_day.png\n"),outdirname,uinfo->filename);
392 exit(EXIT_FAILURE);
393 }
394 if (snprintf(wdirname,sizeof(wdirname),"%s/%s.day",tmp,uinfo->filename)>=sizeof(wdirname)) {
395 debuga(_("user name too long for %s/%s.day\n"),tmp,uinfo->filename);
396 exit(EXIT_FAILURE);
397 }
398 if (snprintf(tmp5,sizeof(tmp5),"%s/%s.graph",tmp,uinfo->filename)>=sizeof(tmp5)) {
399 debuga(_("user name too long for %s/%s.graph\n"),tmp,uinfo->filename);
400 exit(EXIT_FAILURE);
401 }
402
403 if(access(wdirname, R_OK) != 0) {
404 gdImageDestroy(im);
405 return;
406 }
407
408 if(strcmp(DateFormat,"e") == 0)
409 sprintf(csort,"sort -t\"/\" -k 1,1 -o \"%s\" \"%s\"",tmp5,wdirname);
410 else
411 sprintf(csort,"sort -t\"/\" -k 2,2 -o \"%s\" \"%s\"",tmp5,wdirname);
412
413 cstatus=system(csort);
414 if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
415 debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
416 debuga(_("sort command: %s\n"),csort);
417 exit(EXIT_FAILURE);
418 }
419
420 if((fp_in=fopen(tmp5,"r"))==NULL) {
421 debuga(_("(grepday) Cannot open log file %s\n"),tmp5);
422 exit(EXIT_FAILURE);
423 }
424
425 if((pngout=fopen(graph,"wb"))==NULL) {
426 debuga(_("(grepday) Cannot open log file %s\n"),graph);
427 exit(EXIT_FAILURE);
428 }
429
430 while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
431 fixendofline(buf);
432 getword_start(&gwarea,buf);
433 if (getword(data,sizeof(data),&gwarea,'\t')<0) {
434 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp5);
435 exit(EXIT_FAILURE);
436 }
437 getword_start(&gwarea1,data);
438 if (getword_atoll(&llday,&gwarea1,'/')<0) {
439 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp5);
440 exit(EXIT_FAILURE);
441 }
442 if(strcmp(DateFormat,"u") == 0) {
443 if (getword_atoll(&llday,&gwarea1,'/')<0) {
444 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp5);
445 exit(EXIT_FAILURE);
446 }
447 }
448 day=(int)llday;
449 if(!count) {
450 oday=day;
451 count++;
452 }
453 if (getword_skip(20,&gwarea,'\t')<0 || getword_atoll(&bytes,&gwarea,'\t')<0) {
454 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp5);
455 exit(EXIT_FAILURE);
456 }
457
458 if(oday!=day) {
459 x1 = 44 +(oday * 20);
460 bar(x1,tot);
461 oday=day;
462 tot=0;
463 }
464 tot+=bytes;
465 }
466
467 if(tot) {
468 x1 = 44 +(day * 20);
469 bar(x1,tot);
470 }
471
472 gdImagePng(im, pngout);
473 fclose(pngout);
474 gdImageDestroy(im);
475
476 fclose(fp_in);
477 unlink(wdirname);
478 unlink(tmp5);
479
480 #endif //HAVE_GD
481
482 return;
483 }
484
485 void greport_cleanup(void)
486 {
487 #ifdef HAVE_GD
488 gdFontCacheShutdown();
489 #endif
490 }