static void load_ip_agent_list (void) { int type_ip = 0; /* make sure we have a valid IP */ int sel = gscroll.module[gscroll.current].scroll; GDashData item = dash->module[HOSTS].data[sel]; if (!invalid_ipaddr (item.metrics->data, &type_ip)) load_agent_list (main_win, item.metrics->data); }
/* Entry point to set GeoIP location into the corresponding buffers, * (continent, country, city). * * On error, 1 is returned * On success, buffers are set and 0 is returned */ int set_geolocation (char *host, char *continent, char *country, char *city) { int type_ip = 0; if (geo_location_data == NULL) return 1; if (invalid_ipaddr (host, &type_ip)) return 1; geoip_get_country (host, country, type_ip); geoip_get_continent (host, continent, type_ip); if (conf.geoip_database) geoip_get_city (host, city, type_ip); return 0; }
static int parse_format (GLogItem * glog, const char *fmt, const char *date_format, char *str) { const char *p; double serve_secs; int special = 0; struct tm tm; unsigned long long bandw, serve_time; if (str == NULL || *str == '\0') return 1; memset (&tm, 0, sizeof (tm)); /* iterate over the log format */ for (p = fmt; *p; p++) { if (*p == '%') { special++; continue; } if (special && *p != '\0') { char *pch, *sEnd, *bEnd, *tkn = NULL, *end = NULL; errno = 0; bandw = 0; serve_time = 0; serve_secs = 0; switch (*p) { /* date */ case 'd': if (glog->date) return 1; /* parse date format including dates containing spaces, * i.e., syslog date format (Jul 15 20:10:56) */ tkn = parse_string (&str, p[1], count_matches (date_format, ' ') + 1); if (tkn == NULL) return 1; end = strptime (tkn, date_format, &tm); if (end == NULL || *end != '\0') { free (tkn); return 1; } glog->date = tkn; break; /* remote hostname (IP only) */ case 'h': if (glog->host) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) return 1; if (invalid_ipaddr (tkn)) { free (tkn); return 1; } glog->host = tkn; break; /* request method */ case 'm': if (glog->method) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) return 1; if (!extract_method (tkn)) { free (tkn); return 1; } glog->method = tkn; break; /* request not including method or protocol */ case 'U': if (glog->req) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL || *tkn == '\0') return 1; if ((glog->req = decode_url (tkn)) == NULL) return 1; free (tkn); break; /* request protocol */ case 'H': if (glog->protocol) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) return 1; if (invalid_protocol (tkn)) { free (tkn); return 1; } glog->protocol = tkn; break; /* request, including method + protocol */ case 'r': if (glog->req) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) return 1; glog->req = parse_req (tkn, &glog->method, &glog->protocol); free (tkn); break; /* Status Code */ case 's': if (glog->status) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) return 1; strtol (tkn, &sEnd, 10); if (tkn == sEnd || *sEnd != '\0' || errno == ERANGE) { free (tkn); return 1; } glog->status = tkn; break; /* size of response in bytes - excluding HTTP headers */ case 'b': if (glog->resp_size) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) return 1; bandw = strtol (tkn, &bEnd, 10); if (tkn == bEnd || *bEnd != '\0' || errno == ERANGE) bandw = 0; glog->resp_size = bandw; conf.bandwidth = 1; free (tkn); break; /* referrer */ case 'R': if (glog->ref) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) tkn = alloc_string ("-"); if (tkn != NULL && *tkn == '\0') { free (tkn); tkn = alloc_string ("-"); } if (strcmp (tkn, "-") != 0) extract_referer_site (tkn, glog->site); glog->ref = tkn; break; /* user agent */ case 'u': if (glog->agent) return 1; tkn = parse_string (&str, p[1], 1); if (tkn != NULL && *tkn != '\0') { /* Make sure the user agent is decoded (i.e.: CloudFront) * and replace all '+' with ' ' (i.e.: w3c) */ glog->agent = char_replace (decode_url (tkn), '+', ' '); free (tkn); break; } else if (tkn != NULL && *tkn == '\0') { free (tkn); tkn = alloc_string ("-"); } /* must be null */ else { tkn = alloc_string ("-"); } glog->agent = tkn; break; /* time taken to serve the request, in seconds */ case 'T': if (glog->serve_time) return 1; /* ignore seconds if we have microseconds */ if (strstr (fmt, "%D") != NULL) break; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) return 1; if (strchr (tkn, '.') != NULL) serve_secs = strtod (tkn, &bEnd); else serve_secs = strtoull (tkn, &bEnd, 10); if (tkn == bEnd || *bEnd != '\0' || errno == ERANGE) serve_secs = 0; /* convert it to microseconds */ if (serve_secs > 0) glog->serve_time = serve_secs * SECS; else glog->serve_time = 0; conf.serve_usecs = 1; free (tkn); break; /* time taken to serve the request, in microseconds */ case 'D': if (glog->serve_time) return 1; tkn = parse_string (&str, p[1], 1); if (tkn == NULL) return 1; serve_time = strtoull (tkn, &bEnd, 10); if (tkn == bEnd || *bEnd != '\0' || errno == ERANGE) serve_time = 0; glog->serve_time = serve_time; conf.serve_usecs = 1; free (tkn); break; /* everything else skip it */ default: if ((pch = strchr (str, p[1])) != NULL) str += pch - str; } if ((str == NULL) || (*str == '\0')) return 0; special = 0; } else if (special && isspace (p[0])) { return 1; } else str++; } return 0; }
static void get_keys (void) { int search; int c, quit = 1, scrll, offset, ok_mouse; int *scroll_ptr, *offset_ptr; int exp_size = DASH_EXPANDED - DASH_NON_DATA; MEVENT event; char buf[LINE_BUFFER]; FILE *fp = NULL; unsigned long long size1 = 0, size2 = 0; if (!logger->piping) size1 = file_size (conf.ifile); while (quit) { c = wgetch (stdscr); switch (c) { case 'q': /* quit */ if (!scrolling.expanded) { quit = 0; break; } collapse_current_module (); break; case KEY_F (1): case '?': case 'h': load_help_popup (main_win); render_screens (); break; case 49: /* 1 */ /* reset expanded module */ set_module_to (&scrolling, VISITORS); break; case 50: /* 2 */ /* reset expanded module */ set_module_to (&scrolling, REQUESTS); break; case 51: /* 3 */ /* reset expanded module */ set_module_to (&scrolling, REQUESTS_STATIC); break; case 52: /* 4 */ /* reset expanded module */ set_module_to (&scrolling, NOT_FOUND); break; case 53: /* 5 */ /* reset expanded module */ set_module_to (&scrolling, HOSTS); break; case 54: /* 6 */ /* reset expanded module */ set_module_to (&scrolling, OS); break; case 55: /* 7 */ /* reset expanded module */ set_module_to (&scrolling, BROWSERS); break; case 56: /* 8 */ /* reset expanded module */ set_module_to (&scrolling, REFERRERS); break; case 57: /* 9 */ /* reset expanded module */ set_module_to (&scrolling, REFERRING_SITES); break; case 48: /* 0 */ /* reset expanded module */ set_module_to (&scrolling, KEYPHRASES); break; case 33: /* Shift+1 */ /* reset expanded module */ #ifdef HAVE_LIBGEOIP set_module_to (&scrolling, GEO_LOCATION); #else set_module_to (&scrolling, STATUS_CODES); #endif break; #ifdef HAVE_LIBGEOIP case 64: /* Shift+2 */ /* reset expanded module */ set_module_to (&scrolling, STATUS_CODES); break; #endif case 9: /* TAB */ /* reset expanded module */ collapse_current_module (); scrolling.current++; if (scrolling.current == TOTAL_MODULES) scrolling.current = 0; render_screens (); break; case 353: /* Shift TAB */ /* reset expanded module */ collapse_current_module (); if (scrolling.current == 0) scrolling.current = TOTAL_MODULES - 1; else scrolling.current--; render_screens (); break; case 'g': /* g = top */ if (!scrolling.expanded) scrolling.dash = 0; else { scrolling.module[scrolling.current].scroll = 0; scrolling.module[scrolling.current].offset = 0; } display_content (main_win, logger, dash, &scrolling); break; case 'G': /* G = down */ if (!scrolling.expanded) scrolling.dash = dash->total_alloc - real_size_y; else { scrll = offset = 0; scrll = dash->module[scrolling.current].idx_data - 1; if (scrll >= exp_size && scrll >= offset + exp_size) offset = scrll < exp_size - 1 ? 0 : scrll - exp_size + 1; scrolling.module[scrolling.current].scroll = scrll; scrolling.module[scrolling.current].offset = offset; } display_content (main_win, logger, dash, &scrolling); break; /* expand dashboard module */ case KEY_RIGHT: case 0x0a: case 0x0d: case 32: /* ENTER */ case 79: /* o */ case 111: /* O */ case KEY_ENTER: if (scrolling.expanded && scrolling.current == HOSTS) { /* make sure we have a valid IP */ int sel = scrolling.module[scrolling.current].scroll; if (!invalid_ipaddr (dash->module[HOSTS].data[sel].data)) load_agent_list (main_win, dash->module[HOSTS].data[sel].data); break; } if (scrolling.expanded) break; reset_scroll_offsets (&scrolling); scrolling.expanded = 1; free_holder_by_module (&holder, scrolling.current); free_dashboard (dash); allocate_holder_by_module (scrolling.current); allocate_data (); display_content (main_win, logger, dash, &scrolling); break; case KEY_DOWN: /* scroll main dashboard */ if ((scrolling.dash + real_size_y) < (unsigned) dash->total_alloc) { scrolling.dash++; display_content (main_win, logger, dash, &scrolling); } break; case KEY_MOUSE: /* handles mouse events */ ok_mouse = getmouse (&event); if (conf.mouse_support && ok_mouse == OK) { if (event.bstate & BUTTON1_CLICKED) { /* ignore header/footer clicks */ if (event.y < MAX_HEIGHT_HEADER || event.y == LINES - 1) break; if (set_module_from_mouse_event (&scrolling, dash, event.y)) break; reset_scroll_offsets (&scrolling); scrolling.expanded = 1; free_holder_by_module (&holder, scrolling.current); free_dashboard (dash); allocate_holder_by_module (scrolling.current); allocate_data (); render_screens (); } } break; case 106: /* j - DOWN expanded module */ scroll_ptr = &scrolling.module[scrolling.current].scroll; offset_ptr = &scrolling.module[scrolling.current].offset; if (!scrolling.expanded) break; if (*scroll_ptr >= dash->module[scrolling.current].idx_data - 1) break; ++(*scroll_ptr); if (*scroll_ptr >= exp_size && *scroll_ptr >= *offset_ptr + exp_size) ++(*offset_ptr); display_content (main_win, logger, dash, &scrolling); break; /* scroll up main_win */ case KEY_UP: if (scrolling.dash > 0) { scrolling.dash--; display_content (main_win, logger, dash, &scrolling); } break; case 2: /* ^ b - page up */ case 339: /* ^ PG UP */ scroll_ptr = &scrolling.module[scrolling.current].scroll; offset_ptr = &scrolling.module[scrolling.current].offset; if (!scrolling.expanded) break; /* decrease scroll and offset by exp_size */ *scroll_ptr -= exp_size; if (*scroll_ptr < 0) *scroll_ptr = 0; if (*scroll_ptr < *offset_ptr) *offset_ptr -= exp_size; if (*offset_ptr <= 0) *offset_ptr = 0; display_content (main_win, logger, dash, &scrolling); break; case 6: /* ^ f - page down */ case 338: /* ^ PG DOWN */ scroll_ptr = &scrolling.module[scrolling.current].scroll; offset_ptr = &scrolling.module[scrolling.current].offset; if (!scrolling.expanded) break; *scroll_ptr += exp_size; if (*scroll_ptr >= dash->module[scrolling.current].idx_data - 1) *scroll_ptr = dash->module[scrolling.current].idx_data - 1; if (*scroll_ptr >= exp_size && *scroll_ptr >= *offset_ptr + exp_size) *offset_ptr += exp_size; if (*offset_ptr + exp_size >= dash->module[scrolling.current].idx_data - 1) *offset_ptr = dash->module[scrolling.current].idx_data - exp_size; if (*scroll_ptr < exp_size - 1) *offset_ptr = 0; display_content (main_win, logger, dash, &scrolling); break; case 107: /* k - UP expanded module */ scroll_ptr = &scrolling.module[scrolling.current].scroll; offset_ptr = &scrolling.module[scrolling.current].offset; if (!scrolling.expanded) break; if (*scroll_ptr <= 0) break; --(*scroll_ptr); if (*scroll_ptr < *offset_ptr) --(*offset_ptr); display_content (main_win, logger, dash, &scrolling); break; case 'n': pthread_mutex_lock (&gdns_thread.mutex); search = perform_next_find (holder, &scrolling); pthread_mutex_unlock (&gdns_thread.mutex); if (search == 0) { free_dashboard (dash); allocate_data (); render_screens (); } break; case '/': if (render_find_dialog (main_win, &scrolling)) break; pthread_mutex_lock (&gdns_thread.mutex); search = perform_next_find (holder, &scrolling); pthread_mutex_unlock (&gdns_thread.mutex); if (search == 0) { free_dashboard (dash); allocate_data (); render_screens (); } break; case 99: /* c */ if (conf.no_color) break; load_schemes_win (main_win); free_dashboard (dash); allocate_data (); render_screens (); break; case 115: /* s */ load_sort_win (main_win, scrolling.current, &module_sort[scrolling.current]); pthread_mutex_lock (&gdns_thread.mutex); free_holder (&holder); pthread_cond_broadcast (&gdns_thread.not_empty); pthread_mutex_unlock (&gdns_thread.mutex); free_dashboard (dash); allocate_holder (); allocate_data (); render_screens (); break; case 269: case KEY_RESIZE: endwin (); refresh (); werase (header_win); werase (main_win); werase (stdscr); term_size (main_win); refresh (); render_screens (); break; default: if (logger->piping) break; size2 = file_size (conf.ifile); /* file has changed */ if (size2 != size1) { if (!(fp = fopen (conf.ifile, "r"))) FATAL ("Unable to read log file %s.", strerror (errno)); if (!fseeko (fp, size1, SEEK_SET)) while (fgets (buf, LINE_BUFFER, fp) != NULL) parse_log (&logger, buf, -1); fclose (fp); size1 = size2; pthread_mutex_lock (&gdns_thread.mutex); free_holder (&holder); pthread_cond_broadcast (&gdns_thread.not_empty); pthread_mutex_unlock (&gdns_thread.mutex); free_dashboard (dash); allocate_holder (); allocate_data (); term_size (main_win); render_screens (); usleep (200000); /* 0.2 seconds */ } break; } } }