/* A wrapper function to ouput an array of user agents for each host. */ static void process_host_agents (GJSON * json, GHolderItem * item, int iisp) { GAgents *agents = new_gagents (); int i, n = 0, iiisp = 0; /* use tabs to prettify output */ if (conf.json_pretty_print) iiisp = iisp + 1; if (set_host_agents (item->metrics->data, load_host_agents, agents) == 1) return; pjson (json, ",%.*s%.*s\"items\": [%.*s", nlines, NL, iisp, TAB, nlines, NL); n = agents->size > 10 ? 10 : agents->size; for (i = 0; i < n; ++i) { pjson (json, "%.*s\"", iiisp, TAB); escape_json_output (json, agents->items[i].agent); if (i == n - 1) pjson (json, "\""); else pjson (json, "\",%.*s", nlines, NL); } pclose_arr (json, iisp, 1); /* clean stuff up */ free_agents_array (agents); }
/* render a list of agents if available */ void load_agent_list (WINDOW * main_win, char *addr) { char buf[256]; char *ptr_value; GAgents *agents = NULL; GMenu *menu; int c, quit = 1, delims = 0; int i, n = 0, alloc = 0; int y, x, list_h, list_w, menu_w, menu_h; void *value_ptr = NULL; WINDOW *win; if (!conf.list_agents) return; getmaxyx (stdscr, y, x); list_h = y / 2; /* list window - height */ list_w = x - 4; /* list window - width */ menu_h = list_h - AGENTS_MENU_Y - 1; /* menu window - height */ menu_w = list_w - AGENTS_MENU_X - AGENTS_MENU_X; /* menu window - width */ #ifdef HAVE_LIBTOKYOCABINET value_ptr = tc_db_get_str (ht_hosts_agents, addr); #else value_ptr = g_hash_table_lookup (ht_hosts_agents, addr); #endif if (value_ptr != NULL) { ptr_value = (char *) value_ptr; delims = count_matches (ptr_value, '|'); n = ((strlen (ptr_value) + menu_w - 1) / menu_w) + delims + 1; agents = new_gagents (n); alloc = split_agent_str (ptr_value, agents, menu_w); #ifdef HAVE_LIBTOKYOCABINET free (value_ptr); #endif } win = newwin (list_h, list_w, (y - list_h) / 2, (x - list_w) / 2); keypad (win, TRUE); wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); /* create a new instance of GMenu and make it selectable */ menu = new_gmenu (win, menu_h, menu_w, AGENTS_MENU_Y, AGENTS_MENU_X); /* add items to GMenu */ menu->items = (GItem *) xcalloc (alloc, sizeof (GItem)); for (i = 0; i < alloc; ++i) { menu->items[i].name = alloc_string (agents[i].agents); menu->items[i].checked = 0; menu->size++; } post_gmenu (menu); snprintf (buf, sizeof buf, "User Agents for %s", addr); draw_header (win, buf, " %s", 1, 1, list_w - 2, 1, 0); mvwprintw (win, 2, 2, "[UP/DOWN] to scroll - [q] to close window"); wrefresh (win); while (quit) { c = wgetch (stdscr); switch (c) { case KEY_DOWN: gmenu_driver (menu, REQ_DOWN); draw_header (win, "", "%s", 3, 2, CONF_MENU_W, 0, 0); break; case KEY_UP: gmenu_driver (menu, REQ_UP); draw_header (win, "", "%s", 3, 2, CONF_MENU_W, 0, 0); break; case KEY_RESIZE: case 'q': quit = 0; break; } wrefresh (win); } /* clean stuff up */ for (i = 0; i < alloc; ++i) free (menu->items[i].name); free (menu->items); free (menu); for (i = 0; i < alloc; ++i) free (agents[i].agents); if (agents) free (agents); touchwin (main_win); close_win (win); wrefresh (main_win); }