/* add a first level item to dashboard */ static void add_item_to_dash (GDash ** dash, GHolderItem item, GModule module) { GDashData *idata; int *idx = &(*dash)->module[module].idx_data; idata = &(*dash)->module[module].data[(*idx)]; idata->metrics = new_gmetrics (); idata->metrics->bw.sbw = filesize_str (item.metrics->bw.nbw); idata->metrics->data = xstrdup (item.metrics->data); idata->metrics->hits = item.metrics->hits; idata->metrics->visitors = item.metrics->visitors; if (conf.append_method && item.metrics->method) idata->metrics->method = item.metrics->method; if (conf.append_protocol && item.metrics->protocol) idata->metrics->protocol = item.metrics->protocol; if (conf.serve_usecs) { idata->metrics->avgts.sts = usecs_to_str (item.metrics->avgts.nts); idata->metrics->cumts.sts = usecs_to_str (item.metrics->cumts.nts); idata->metrics->maxts.sts = usecs_to_str (item.metrics->maxts.nts); } (*idx)++; }
/* add an item from a sub_list to the dashboard */ static void add_sub_item_to_dash (GDash ** dash, GHolderItem item, GModule module, int *i) { GSubList *sub_list = item.sub_list; GSubItem *iter; GDashData *idata; char *entry; int *idx; idx = &(*dash)->module[module].idx_data; if (sub_list == NULL) return; for (iter = sub_list->head; iter; iter = iter->next, (*i)++) { entry = render_child_node (iter->metrics->data); if (!entry) continue; idata = &(*dash)->module[module].data[(*idx)]; idata->metrics = new_gmetrics (); idata->metrics->visitors = iter->metrics->visitors; idata->metrics->bw.sbw = filesize_str (iter->metrics->bw.nbw); idata->metrics->data = xstrdup (entry); idata->metrics->hits = iter->metrics->hits; if (conf.serve_usecs) { idata->metrics->avgts.sts = usecs_to_str (iter->metrics->avgts.nts); idata->metrics->cumts.sts = usecs_to_str (iter->metrics->cumts.nts); idata->metrics->maxts.sts = usecs_to_str (iter->metrics->maxts.nts); } idata->is_subitem = 1; (*idx)++; free (entry); } }
/* add a first level item to dashboard */ static void add_item_to_dash (GDash ** dash, GHolderItem item, GModule module) { int *idx = &(*dash)->module[module].idx_data; (*dash)->module[module].data[(*idx)].bandwidth = filesize_str (item.bw); (*dash)->module[module].data[(*idx)].bw = item.bw; (*dash)->module[module].data[(*idx)].data = xstrdup (item.data); (*dash)->module[module].data[(*idx)].hits = item.hits; if (conf.serve_usecs) { (*dash)->module[module].data[(*idx)].usecs = item.usecs; (*dash)->module[module].data[(*idx)].serve_time = usecs_to_str (item.usecs); } (*idx)++; }
static void print_html_request_report (FILE * fp, GHolder * h, int process) { #ifdef TCB_BTREE TCBDB *ht = NULL; #elif TCB_MEMHASH TCMDB *ht = NULL; #else GHashTable *ht; #endif char *data, *bandwidth, *usecs; const char *desc = REQUE_DESC; const char *head = REQUE_HEAD; const char *id = REQUE_ID; float percent; int hits; int i, until = 0; if (h->idx == 0) return; ht = get_ht_by_module (h->module); if (ht == ht_requests_static) { head = STATI_HEAD; id = STATI_ID; desc = STATI_DESC; } else if (ht == ht_not_found_requests) { head = FOUND_HEAD; id = FOUND_ID; desc = FOUND_DESC; } print_html_h2 (fp, head, id); print_p (fp, desc); print_html_begin_table (fp); print_html_begin_thead (fp); fprintf (fp, "<tr>"); fprintf (fp, "<th>Hits</th>"); fprintf (fp, "<th>%%</th>"); fprintf (fp, "<th>Bandwidth</th>"); if (conf.serve_usecs) fprintf (fp, "<th>Time served</th>"); if (conf.append_protocol) fprintf (fp, "<th>Protocol</th>"); if (conf.append_method) fprintf (fp, "<th>Method</th>"); fprintf (fp, "<th>URL<span class=\"r\" onclick=\"t(this)\">◀</span>"); fprintf (fp, "</th>"); fprintf (fp, "</tr>"); print_html_end_thead (fp); print_html_begin_tbody (fp); until = h->idx < MAX_CHOICES ? h->idx : MAX_CHOICES; for (i = 0; i < until; i++) { hits = h->items[i].hits; data = h->items[i].data; percent = get_percentage (process, hits); percent = percent < 0 ? 0 : percent; bandwidth = filesize_str (h->items[i].bw); print_html_begin_tr (fp, i > OUTPUT_N ? 1 : 0); /* hits */ fprintf (fp, "<td>%d</td>", hits); /* percent */ fprintf (fp, "<td>%4.2f%%</td>", percent); /* bandwidth */ fprintf (fp, "<td>"); clean_output (fp, bandwidth); fprintf (fp, "</td>"); /* usecs */ if (conf.serve_usecs) { usecs = usecs_to_str (h->items[i].usecs); fprintf (fp, "<td>"); clean_output (fp, usecs); fprintf (fp, "</td>"); free (usecs); } /* protocol */ if (conf.append_protocol) { fprintf (fp, "<td>"); clean_output (fp, h->items[i].protocol); fprintf (fp, "</td>"); } /* method */ if (conf.append_method) { fprintf (fp, "<td>"); clean_output (fp, h->items[i].method); fprintf (fp, "</td>"); } /* data */ fprintf (fp, "<td>"); clean_output (fp, data); fprintf (fp, "</td>"); print_html_end_tr (fp); free (bandwidth); } print_html_end_tbody (fp); print_html_end_table (fp); }
static void print_html_hosts (FILE * fp, GHolder * h, int process) { GAgents *agents; char *data, *bandwidth, *usecs, *ag, *ptr_value, *host; float percent, l; int hits; int i, j, max, until = 0, delims = 0, colspan = 6; size_t alloc = 0; #ifdef HAVE_LIBGEOIP const char *location = NULL; colspan++; #endif if (h->idx == 0) return; print_html_h2 (fp, HOSTS_HEAD, HOSTS_ID); print_p (fp, HOSTS_DESC); print_html_begin_table (fp); print_html_begin_thead (fp); fprintf (fp, "<tr>"); fprintf (fp, "<th></th>"); fprintf (fp, "<th>Hits</th>"); fprintf (fp, "<th>%%</th>"); fprintf (fp, "<th>Bandwidth</th>"); if (conf.serve_usecs) { colspan++; fprintf (fp, "<th>Time served</th>"); } fprintf (fp, "<th>IP</th>"); #ifdef HAVE_LIBGEOIP fprintf (fp, "<th>Country</th>"); #endif if (conf.enable_html_resolver) { colspan++; fprintf (fp, "<th>Hostname</th>"); } fprintf (fp, "<th style=\"width:100%%;text-align:right;\">"); fprintf (fp, "<span class=\"r\" onclick=\"t(this)\">◀</span>"); fprintf (fp, "</th>"); fprintf (fp, "</tr>"); print_html_end_thead (fp); print_html_begin_tbody (fp); until = h->idx < MAX_CHOICES ? h->idx : MAX_CHOICES; max = 0; for (i = 0; i < until; i++) { if (h->items[i].hits > max) max = h->items[i].hits; } for (i = 0; i < until; i++) { hits = h->items[i].hits; data = h->items[i].data; percent = get_percentage (process, hits); percent = percent < 0 ? 0 : percent; bandwidth = filesize_str (h->items[i].bw); l = get_percentage (max, hits); l = l < 1 ? 1 : l; #ifdef HAVE_LIBTOKYOCABINET ag = tc_db_get_str (ht_hosts_agents, data); #else ag = g_hash_table_lookup (ht_hosts_agents, data); #endif print_html_begin_tr (fp, i > OUTPUT_N ? 1 : 0); fprintf (fp, "<td>"); if (ag != NULL) fprintf (fp, "<span class=\"s\" onclick=\"a(this)\">▶</span>"); else fprintf (fp, "<span class=\"s\">-</span>"); fprintf (fp, "</td>"); fprintf (fp, "<td>%d</td>", hits); fprintf (fp, "<td>%4.2f%%</td>", percent); fprintf (fp, "<td>"); clean_output (fp, bandwidth); fprintf (fp, "</td>"); /* usecs */ if (conf.serve_usecs) { usecs = usecs_to_str (h->items[i].usecs); fprintf (fp, "<td>"); clean_output (fp, usecs); fprintf (fp, "</td>"); free (usecs); } fprintf (fp, "<td>%s</td>", data); #ifdef HAVE_LIBGEOIP location = get_geoip_data (data); fprintf (fp, "<td style=\"white-space:nowrap;\">%s</td>", location); #endif if (conf.enable_html_resolver) { host = reverse_ip (data); fprintf (fp, "<td style=\"white-space:nowrap;\">%s</td>", host); free (host); } fprintf (fp, "<td class=\"graph\">"); fprintf (fp, "<div class=\"bar\" style=\"width:%f%%\"></div>", l); fprintf (fp, "</td>"); print_html_end_tr (fp); /* render agents for each host */ if (ag != NULL) { ptr_value = (char *) ag; delims = count_occurrences (ptr_value, '|'); /* round-up + padding */ alloc = ((strlen (ptr_value) + 300 - 1) / 300) + delims + 1; agents = xmalloc (alloc * sizeof (GAgents)); memset (agents, 0, alloc * sizeof (GAgents)); /* split agents into struct */ split_agent_str (ptr_value, agents, 300); fprintf (fp, "<tr class=\"agent-hide\">\n"); fprintf (fp, "<td colspan=\"%d\">\n", colspan); fprintf (fp, "<div>"); fprintf (fp, "<table class=\"pure-table-striped\">"); /* output agents from struct */ for (j = 0; (j < 10) && (agents[j].agents != NULL); j++) { print_html_begin_tr (fp, 0); fprintf (fp, "<td>"); clean_output (fp, agents[j].agents); fprintf (fp, "</td>"); print_html_end_tr (fp); } fprintf (fp, "</table>\n"); fprintf (fp, "</div>\n"); fprintf (fp, "</td>\n"); print_html_end_tr (fp); for (j = 0; (agents[j].agents != NULL); j++) free (agents[j].agents); free (agents); #ifdef HAVE_LIBTOKYOCABINET if (ag) free (ag); #endif } free (bandwidth); } print_html_end_tbody (fp); print_html_end_table (fp); }