431d044bf3d36fb53ada3ae48340152c5744c613
1 /* Modified by: xChaos, 20131119 */
3 #include "cll1-0.6.2.h"
7 extern int row_odd_even
;
8 extern int use_jquery_popups
;
9 extern struct IP
*ips
, *ip
, *sharedip
;
10 extern struct Group
*groups
, *group
;
11 extern struct Keyword
*keyword
, *defaultkeyword
, *keywords
;
12 extern const int highest_priority
;
13 extern const char *version
;
14 extern const char *stats_html_signature
;
15 extern char *jquery_url
;
16 extern int keywordcount
;
21 extern int found_code
;
24 extern char *ip6prefix
;
25 extern int traffic_detected
;
27 const char *tr_odd_even(void);
28 /* implemented in prometheus.c, shared with parselogs.c */
30 void append_log(struct IP
*self
) /*using global variables*/
35 date(d
); /* this is typical cll1.h macro - prints current date */
37 sprintf(str
, "%s/%s.log", log_dir
, self
->name
);
39 /*-----------------------------------------------------------------*/
40 printf("Writing traffic log %s ...\n", str
);
41 /*-----------------------------------------------------------------*/
45 fprintf(f
, "%ld\t%s\t%Lu\t%Lu\t%Lu\t%Lu\t%d\t%d\t%d\t%s\t%s",
46 time(NULL
), self
->name
, self
->traffic
, self
->direct
, self
->proxy
,
47 self
->upload
, self
->min
, self
->max
, self
->desired
, self
->code
, d
); /* d = date*/
56 void write_htmlandlogs(char *html
, char *d
, int total
, int just_preview
)
60 FILE *f
=fopen(html
, "w");
70 fprintf(f
,"<script type=\"text/javascript\" src=\"%s\"></script>\n", jquery_url
);
72 fputs("<table class=\"decorated last\">\n\
73 <caption>Bandwidth classes</caption>\n\
75 <th style=\"text-align: right\">#</th>\n\
76 <th style=\"text-align: right\">group</th>\n\
77 <th style=\"text-align: right\">IPs</th>\n\
78 <th style=\"text-align: right\">requested</th>\n",f
);
79 fprintf(f
,"<th colspan=\"%d\">data limits</th>\n", keywordcount
);
80 fputs("</tr></thead><tbody>\n",f
);
83 for_each(group
, groups
)
86 printf("%d kb/s group: %d bandwidth requested: %d kb/s\n",group
->min
,group
->count
,group
->desired
);
88 fprintf(f
, "%s<td style=\"text-align: right\">%d</td><td style=\"text-align: right\">%d kb/s</td>",
89 tr_odd_even(), count
, group
->min
);
90 fprintf(f
, "<td style=\"text-align: right\">%d</td><td style=\"text-align: right\">%d kb/s</td>",
91 group
->count
, group
->desired
);
93 for_each(keyword
, keywords
) if(keyword
->ip_count
)
95 fprintf(f
, "<td style=\"text-align: right\"><span style=\"color:#%s\">%d MB</span></td>",
96 keyword
->html_color
, group
->min
*keyword
->data_limit
);
99 total
+= group
->count
;
103 printf("Total groups: %d Total bandwidth requested: %d kb/s\n",
106 fprintf(f
,"</tr></tbody>\n\
108 <th colspan=\"2\" style=\"text-align: left\"></td>");
109 fprintf(f
,"<th style=\"text-align: right\">%d</td><th style=\"text-align: right\">%d kb/s</td>",total
,i
);
111 for_each(keyword
, keywords
) if(keyword
->ip_count
)
113 fprintf(f
,"<th style=\"text-align: right\">%d IPs</th>",keyword
->ip_count
);
115 fprintf(f
,"</tr><tr><th colspan=\"4\"></th>\n");
116 fprintf(f
,"<th colspan=\"%d\">%d traffic classes</th></tr>\n", keywordcount
, total
);
118 fputs("</thead></table>\n",f
);
128 unsigned long long total_traffic
= 1 /* prevent divide by zero */ , total_direct
=0, total_proxy
=0, total_upload
=0, tmp_sum
= 0;
129 unsigned long long total_pktup
= 0, total_pktdown
= 0;
130 int active_classes
= 0;
132 struct Sum
{unsigned long long l
; int i
; list(Sum
);} *sum
,*sums
= NULL
;
133 int agreg_count
= 0, limit_count
= 0, prio_count
= 0;
134 int popup_button
= 0;
135 /* IPv6 vs. IPv4 stats */
136 unsigned long long pkts4
= 1, pkts6
= 1 /*prevent divide by zero */, bytes4
= 0, bytes6
= 0;
137 int count4
= 0, count6
= 0;
147 if(use_jquery_popups
)
149 fprintf(f
,"<script type=\"text/javascript\">\
150 function show_section(n) {\
151 $(\'#sharing_\'+n).show();\
152 $(\'#download_'+n).show();\
153 $(\'#pktsdown_\'+n).show();\
154 $(\'#upload_'+n).show();\
155 $(\'#pktsup_\'+n).show();\
159 fprintf(f
,"<p><table class=\"decorated last\">\n<caption>%s",title
);
160 fprintf(f
," (%s)</caption>\n", d
);
161 fputs("<thead><tr>\n<th colspan=\"3\"> </th>\n",f
);
162 fputs("<th style=\"text-align: right\">cred.</th>\n\
163 <th style=\"text-align: right\">FUP</th>\n\
164 <th style=\"text-align: right\">total</th>\n\
165 <th style=\"text-align: center\" colspan=\"2\">upload</th>\n",f
);
169 fputs("<th style=\"text-align: right\">proxy</th>\n",f);
172 fputs("<th style=\"text-align: center\" colspan=\"2\">download</th>\n\
173 <th style=\"text-align: right\">min</th>\n\
174 <th style=\"text-align: right\">max</th>\n\
175 <th style=\"text-align: right\">limit</th>\n\
178 <th style=\"text-align: right\">#</th>\n\
179 <th>hostname [+sharing]</th>\n\
180 <th style=\"text-align: right\">LMS</th>\n\
181 <th style=\"text-align: right\">MB</th>\n\
182 <th style=\"text-align: right\">MB</th>\n\
183 <th style=\"text-align: right\">MB</th>\n\
184 <th style=\"text-align: right\">MB</th>\n\
185 <th style=\"text-align: right\">pkt</th>\n\
186 <th style=\"text-align: right\">MB</th>\n\
187 <th style=\"text-align: right\">pkt</th>\n\
188 <th style=\"text-align: right\">kb/s</th>\n\
189 <th style=\"text-align: right\">kb/s</th>\n\
190 <th style=\"text-align: right\">kb/s</th>\n\
192 </tr></thead><tbody>\n",f
);
195 for_each(ip
,ips
) if(!use_jquery_popups
|| !ip
->sharing
)
200 if(ip
->aggregated
> 1)
202 f1
= "<span style=\"color:green\">";
206 else if(ip
->max
< ip
->desired
)
208 f1
= "<span style=\"color:red\">";
212 else if(ip
->prio
> highest_priority
+1)
214 f1
= "<span style=\"color:brown\">";
220 printf("%03d. %-22s %10Lu (%d/%d)\n",i
,ip
->name
, ip
->traffic
, ip
->min
, ip
->max
);
222 /* hostnames -------------------------------------- */
223 fprintf(f
,"%s<td style=\"text-align: right\"><a name=\"%s\"></a>%d</td>\
224 <td><a class=\"blue\" target=\"_blank\" href=\"%s%s.log\">%s</a>\n",
225 tr_odd_even(), ip
->name
, i
, log_url
, ip
->name
, ip
->name
);
227 if(use_jquery_popups
)
229 fprintf(f
, "<span id=\"sharing_%d\" style=\"display:none\">",i
);
232 for_each(sharedip
, ips
) if(eq(ip
->name
, sharedip
->sharing
) && !sharedip
->v6
) /* IPv4 only */
234 fprintf(f
, "<br /><a class=\"blue\" target=\"_blank\" href=\"%s%s.log\">%s</a>\n",
235 log_url
, sharedip
->name
, sharedip
->name
);
239 for_each(sharedip
, ips
) if(eq(ip
->name
, sharedip
->sharing
) && sharedip
->v6
) /* IPv6 only */
241 fprintf(f
, "<br /><a class=\"blue\" target=\"_blank\" href=\"%s%s.log\">%s/%d</a>\n",
242 log_url
, sharedip
->addr
, sharedip
->addr
, sharedip
->mask
);
246 fputs("</span>\n",f
);
249 fprintf(f
, "<span>[<a class=\"blue\" href=\"#\" \
250 onClick=\"$(this).parent().hide();show_section(\'%d\');return(false);\" \
251 style=\"cursor: pointer;\">+%d</a>]</span>",
256 /* ----------------------------------------------- */
260 fputs("<td style=\"text-align: right\">",f
);
263 fprintf(f
, "<a class=\"blue\" target=\"_blank\" href=\"%s%s\">%s</a>\n",
264 lms_url
, ip
->code
, ip
->code
);
266 else if(ip
->code
[0] == 0)
272 fprintf(f
,"<td style=\"text-align: right\">%Lu</td>\n", ip
->credit
);
273 fprintf(f
,"<td style=\"text-align: right\"><span style=\"color:#%s\">%Lu</span></td>",
274 ip
->keyword
->html_color
, ip
->realquota
);
275 fprintf(f
,"<td style=\"text-align: right\">%s%Lu%s</td>", f1
, ip
->traffic
, f2
);
277 /* upload --------------------------------------- */
278 fprintf(f
,"<td style=\"text-align: right\">%Lu", ip
->upload
);
279 if(use_jquery_popups
)
281 fprintf(f
,"<span id=\"upload_%d\" style=\"display:none\">", i
);
282 for_each(sharedip
, ips
) if(eq(ip
->name
, sharedip
->sharing
) && !sharedip
->v6
) /* IPv4 only */
284 fprintf(f
,"<br />%Lu", sharedip
->upload
);
286 for_each(sharedip
, ips
) if(eq(ip
->name
, sharedip
->sharing
) && sharedip
->v6
) /* IPv6 only */
288 fprintf(f
,"<br />%Lu", sharedip
->upload
);
290 fputs("</span>\n",f
);
294 /* pkts up ----------------------------------- */
295 mpkts
= ip
->pktsup
>>20;
296 total_pktup
+= mpkts
;
299 mpkts
= 1; /* prevent divide by zero*/
301 fprintf(f
,"<td style=\"text-align: right\"><span style=\"color: gray\">%d</span>", ip
->upload
/mpkts
);
302 if(use_jquery_popups
)
304 fprintf(f
,"<span id=\"pktsup_%d\" style=\"display:none\">", i
);
305 for_each(sharedip
, ips
) if(eq(ip
->name
, sharedip
->sharing
) && !sharedip
->v6
) /* IPv4 only */
307 mpkts
= sharedip
->pktsup
>>20;
310 mpkts
= 1; /* prevent divide by zero*/
312 fprintf(f
,"<br /><span style=\"color: gray\">%d</span>", sharedip
->upload
/mpkts
);
314 for_each(sharedip
, ips
) if(eq(ip
->name
, sharedip
->sharing
) && sharedip
->v6
) /* IPv6 only */
316 mpkts
= sharedip
->pktsup
>>20;
319 mpkts
= 1; /* prevent divide by zero*/
321 fprintf(f
,"<br /><span style=\"color: gray\">%d</span>", sharedip
->upload
/mpkts
);
323 fputs("</span>\n",f
);
330 fprintf(f,"<td style=\"text-align: right\">%Lu</td>\n", ip->proxy);
333 /* download ---------------------------------------- */
334 fprintf(f
,"<td style=\"text-align: right\">%Lu", ip
->direct
);
335 if(use_jquery_popups
)
337 fprintf(f
,"<span id=\"download_%d\" style=\"display:none\">", i
);
338 for_each(sharedip
,ips
) if(eq(ip
->name
, sharedip
->sharing
) && !sharedip
->v6
) /* IPv4 only */
340 fprintf(f
,"<br />%Lu", sharedip
->direct
);
342 for_each(sharedip
,ips
) if(eq(ip
->name
, sharedip
->sharing
) && sharedip
->v6
) /* IPv6 only */
344 fprintf(f
,"<br />%Lu", sharedip
->direct
);
346 fputs("</span>\n",f
);
350 /* pkts down ---------------------------------------- */
351 mpkts
= ip
->pktsdown
>>20;
352 total_pktdown
+= mpkts
;
355 mpkts
= 1; /* prevent divide by zero*/
357 fprintf(f
,"<td style=\"text-align: right\"><span style=\"color: gray\">%d</span>", ip
->direct
/mpkts
);
358 if(use_jquery_popups
)
360 fprintf(f
,"<span id=\"pktsdown_%d\" style=\"display:none\">", i
);
361 for_each(sharedip
,ips
) if(eq(ip
->name
, sharedip
->sharing
) && !sharedip
->v6
) /* IPv4 only */
363 mpkts
= sharedip
->pktsdown
>>20;
366 mpkts
= 1; /* prevent divide by zero*/
368 fprintf(f
,"<br /><span style=\"color: gray\">%d</span>", sharedip
->direct
/mpkts
);
370 for_each(sharedip
,ips
) if(eq(ip
->name
, sharedip
->sharing
) && sharedip
->v6
) /* IPv6 only */
372 mpkts
= sharedip
->pktsdown
>>20;
375 mpkts
= 1; /* prevent divide by zero*/
377 fprintf(f
,"<br /><span style=\"color: gray\">%d</span>", sharedip
->direct
/mpkts
);
379 fputs("</span>\n",f
);
382 /* ----------------------------------------------- */
384 fprintf(f
, "<td style=\"text-align: right\">%d</td>\n\
385 <td style=\"text-align: right\">%d</td>\n\
386 <td style=\"text-align: right\">%s%d%s</td>\n\
387 <td>%s%d%s</td></tr>\n",
388 ip
->min
, ip
->desired
,
392 total_traffic
+=ip
->traffic
;
393 total_direct
+=ip
->direct
;
394 total_proxy
+=ip
->proxy
;
395 total_upload
+=ip
->upload
;
399 tmp_sum
+=ip
->traffic
;
402 sum
->i
=active_classes
;
403 insert(sum
,sums
,order_by
,i
);
406 if(!just_preview
&& traffic_detected
)
409 for_each(sharedip
,ips
) if(eq(ip
->name
, sharedip
->sharing
))
411 append_log(sharedip
);
419 fprintf(f
, "</tbody><thead><tr>\n\
420 <th colspan=\"5\" style=\"text-align: left\">%d CLASSES</th>", i
);
421 fprintf(f
, "<th style=\"text-align: right\">%Lu</th><th style=\"text-align: right\">%Lu</th>\
422 <th style=\"text-align: right\">%d</th>\n",
423 total_traffic
, total_upload
, total_pktup
/i
);
427 fprintf(f," <th style=\"text-align: right\">%Lu</th>\n", total_proxy);
430 fprintf(f
, "<th style=\"text-align: right\">%Lu</th><th style=\"text-align: right\">%d</th>",
431 total_direct
, total_pktdown
/i
);
432 fprintf(f
, "<th colspan=\"6\">\
433 <span style=\"color:green\">AGR %dx</span> \
434 <span style=\"color:red\">FUP %dx</span> \
435 <span style=\"color:brown\">PRIO %dx</span></th></tr>\n</thead></table>\n",
436 agreg_count
, limit_count
, prio_count
);
444 bytes6
+= ip
->upload
+ ip
->direct
;
445 pkts6
+= ip
->pktsdown
+ ip
->pktsup
;
450 bytes4
+= ip
->upload
+ ip
->direct
;
451 pkts4
+= ip
->pktsdown
+ ip
->pktsup
;
456 perc6
=(double)(bytes6
)/(bytes4
+bytes6
)*100;
457 fputs("<p><table class=\"decorated last\"><caption>IP protocols usage</caption>\n",f
);
458 fprintf(f
, "%s<td>Total %d IPv4 addreses</td><td style=\"text-align: right\">%Lu MB (%.2f %%)</td><td style=\"text-align: right\">%Lu packets (%.2f %%)</td></tr>\n",
459 tr_odd_even(), count4
, bytes4
, (double)(bytes4
)/(bytes4
+bytes6
)*100, pkts4
, (float)(100*pkts4
)/(pkts4
+pkts6
));
460 fprintf(f
, "%s<td>Total %d IPv6 /64 ranges</td><td style=\"text-align: right\">%Lu MB (%.2f %%)</td><td style=\"text-align: right\">%Lu packets (%.2f %%)</td></tr>\n",
461 tr_odd_even(), count6
, bytes6
, perc6
, pkts6
, (float)(100*pkts6
)/(pkts4
+pkts6
));
462 fputs("</table></p>\n", f
);
466 if(active_classes
>10)
468 int top20_count
=0,top20_perc1
=0;
469 long long top20_perc2
=0;
470 unsigned long long top20_sum
=0l;
472 fputs("<a name=\"erp\"></a><p><table class=\"decorated last\"><caption>Enterprise Resource Planning (ERP)</caption>\n",f
);
473 fputs("<thead><tr>\n\
474 <th>Analytic category</th>\n\
475 <th colspan=\"2\" style=\"text-align: center\">Active Classes</th>\n\
476 <th colspan=\"2\" style=\"text-align: center\">Data transfers</th>\n\
477 </tr></thead><tbody>\n",f
);
479 if_exists(sum
,sums
,sum
->l
>= total_traffic
/4)
481 fprintf(f
,"%s<td>Top 25%% of traffic</td>\n", tr_odd_even());
482 fprintf(f
,"<td style=\"text-align: right\">%d</td>\n\
483 <td style=\"text-align: right\">%d %%</td>\n\
484 <td style=\"text-align: right\">%Lu MB</td>\n\
485 <td style=\"text-align: right\">%Ld %%</td></tr>\n",
486 sum
->i
, (100*sum
->i
+50)/active_classes
, sum
->l
, (100*sum
->l
+50)/total_traffic
);
489 if_exists(sum
,sums
,sum
->i
== 10)
491 fprintf(f
,"%s<td>Top 10 downloaders</td>\n", tr_odd_even());
492 fprintf(f
,"<td style=\"text-align: right\"><strong>10</strong></td>\n\
493 <td style=\"text-align: right\">%d %%</td>\n\
494 <td style=\"text-align: right\">%Lu MB</td>\n\
495 <td style=\"text-align: right\">%Ld %%</td></tr>\n",
496 (100*sum
->i
+50)/active_classes
, sum
->l
, (100*sum
->l
+50)/total_traffic
);
499 if_exists(sum
,sums
,sum
->l
>= total_traffic
/2)
501 fprintf(f
,"%s<td>Top 50%% of traffic</td>\n", tr_odd_even());
502 fprintf(f
,"<td style=\"text-align: right\">%d</td>\n\
503 <td style=\"text-align: right\">%d %%</td>\n\
504 <td style=\"text-align: right\">%Lu MB</td>\n\
505 <td style=\"text-align: right\"><strong>%Ld %%</strong></td></tr>\n",
506 sum
->i
,(100*sum
->i
+50)/active_classes
,sum
->l
,(100*sum
->l
+50)/total_traffic
);
509 if_exists(sum
,sums
,sum
->l
>= 4*total_traffic
/5)
511 fprintf(f
,"%s<td>Top 80%% of traffic</td>\n", tr_odd_even());
512 fprintf(f
,"<td style=\"text-align: right\">%d</td>\n\
513 <td style=\"text-align: right\">%d %%</td>\n\
514 <td style=\"text-align: right\">%Lu MB</td>\n\
515 <td style=\"text-align: right\"><strong>%Ld %%</strong></td></tr>\n",
516 sum
->i
,(100*sum
->i
+50)/active_classes
,sum
->l
,(100*sum
->l
+50)/total_traffic
);
519 if_exists(sum
,sums
,sum
->i
>= (active_classes
+1)/5)
521 fprintf(f
,"%s<td>Top 20%% downloaders</td>\n", tr_odd_even());
523 top20_perc1
=(100*sum
->i
+50)/active_classes
;
525 top20_perc2
=(100*sum
->l
+50)/total_traffic
;
526 fprintf(f
,"<td style=\"text-align: right\">%d</td>\n\
527 <td style=\"text-align: right\"><strong>%d %%</strong></td>\n\
528 <td style=\"text-align: right\">%Lu MB</td>\n\
529 <td style=\"text-align: right\">%Ld %%</td></tr>\n",
530 top20_count
,top20_perc1
,top20_sum
,top20_perc2
);
533 if_exists(sum
,sums
,sum
->i
>= (active_classes
+1)/4)
535 fprintf(f
,"%s<td>Top 25%% downloaders</td>\n", tr_odd_even());
536 fprintf(f
,"<td style=\"text-align: right\">%d</td>\n\
537 <td style=\"text-align: right\">%d %%</td>\n\
538 <td style=\"text-align: right\">%Lu MB</td>\n\
539 <td style=\"text-align: right\">%Ld %%</td></tr>\n",
540 sum
->i
,(100*sum
->i
+50)/active_classes
,sum
->l
,(100*sum
->l
+50)/total_traffic
);
543 if_exists(sum
,sums
,sum
->i
>=(active_classes
+1)/2)
545 fprintf(f
,"%s<td>Top 50%% downloaders</td>\n", tr_odd_even());
546 fprintf(f
,"<td style=\"text-align: right\">%d</td>\n\
547 <td style=\"text-align: right\"><strong>%d %%</strong></td>\n\
548 <td style=\"text-align: right\">%Lu MB</td>\n\
549 <td style=\"text-align: right\">%Ld %%</td></tr>\n",
550 sum
->i
,(100*sum
->i
+50)/active_classes
,sum
->l
,(100*sum
->l
+50)/total_traffic
);
553 if_exists(sum
,sums
,sum
->i
>= 4*(active_classes
+1)/5)
555 fprintf(f
,"%s<td>Top 80%% downloaders</td>\n", tr_odd_even());
556 fprintf(f
,"<td style=\"text-align: right\">%d</td>\n\
557 <td style=\"text-align: right\">%d %%</td>\n\
558 <td style=\"text-align: right\">%Lu MB</td>\n\
559 <td style=\"text-align: right\">%Ld %%</td></tr></tbody>\n",
560 sum
->i
,(100*sum
->i
+50)/active_classes
,sum
->l
,(100*sum
->l
+50)/total_traffic
);
563 fprintf(f
,"<thead><tr><th><a class=\"blue\" target=\"_blank\" href=\"%sERP.log\">All users, all traffic</a></th>\n", log_url
);
564 fprintf(f
,"<th style=\"text-align: right\">%d</th>\n\
565 <th style=\"text-align: right\">100 %%</th>\n\
566 <th style=\"text-align: right\">%Lu MB</th>\n\
567 <th style=\"text-align: right\">100 %%</th></tr>\n",active_classes
,total_traffic
);
568 fputs("</thead></table></p>\n", f
);
570 /* write basic ERP data to log directory */
574 sprintf(str
,"%s/ERP.log",log_dir
);
575 iplog
=fopen(str
,"a");
578 fprintf(iplog
, "%ld\t%d\t%d %%\t%Lu M\t%Ld %%\tACTIVE %d\tTRAFFIC %Lu M\tCLASSES %d\tFUP-LIMIT %d\tLOW-PRIO %d\tIPv6 %Lu M\t%.2f %%\t%s",
579 time(NULL
), top20_count
, top20_perc1
, top20_sum
, top20_perc2
,
580 active_classes
, total_traffic
, i
, limit_count
, prio_count
,
581 bytes6
, perc6
, d
); /* d = date*/
591 fprintf(f
, stats_html_signature
, version
);
This page took 0.667213 seconds and 5 git commands to generate.