X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Foping.c;h=a630b8d1f867f8fde83a38fdb92e9b482762d949;hb=3885683edb804a976b89b95d8e5adf041e8912d7;hp=b3a191e274904870a5b468756c7ae6ea896ae2c7;hpb=68d713ec1a7027113f1fa20df598a63539511593;p=liboping.git diff --git a/src/oping.c b/src/oping.c index b3a191e..a630b8d 100644 --- a/src/oping.c +++ b/src/oping.c @@ -85,6 +85,9 @@ # define OPING_GREEN 1 # define OPING_YELLOW 2 # define OPING_RED 3 +# define OPING_GREEN_HIST 4 +# define OPING_YELLOW_HIST 5 +# define OPING_RED_HIST 6 #endif #include "oping.h" @@ -603,12 +606,26 @@ static void time_calc (struct timespec *ts_dest, /* {{{ */ } /* }}} void time_calc */ #if USE_NCURSES -static int update_stats_from_context (ping_context_t *ctx) /* {{{ */ +static int update_stats_from_context (ping_context_t *ctx, pingobj_iter_t *iter) /* {{{ */ { + double latency = -1.0; + size_t buffer_len = sizeof (latency); + int maxx; + getmaxyx(ctx->window, maxx, maxx); + + ping_iterator_get_info (iter, PING_INFO_LATENCY, + &latency, &buffer_len); + + unsigned int sequence = 0; + buffer_len = sizeof (sequence); + ping_iterator_get_info (iter, PING_INFO_SEQUENCE, + &sequence, &buffer_len); + + if ((ctx == NULL) || (ctx->window == NULL)) return (EINVAL); - werase (ctx->window); + /* werase (ctx->window); */ box (ctx->window, 0, 0); wattron (ctx->window, A_BOLD); @@ -638,6 +655,53 @@ static int update_stats_from_context (ping_context_t *ctx) /* {{{ */ deviation); } + if (latency > 0.0) + { + if (has_colors () == TRUE) + { + int color = OPING_GREEN_HIST; + float ratio = 0; + int index = 0; + + ratio = latency / PING_DEF_TTL; + if (ratio > 1) { + ratio = 1; + } + if (ratio > 2/3.0) { + color = OPING_RED_HIST; + } + else if (ratio > 1/3.0) { + color = OPING_YELLOW_HIST; + } + index = (int) (ratio * BARS_LEN * 3); /* 3 colors */ + /* HOST_PRINTF ("%%r%f-ia%d-", ratio, index); */ + index = index % (BARS_LEN-1); + /* HOST_PRINTF ("im%d-", index); */ + if (index < 0) { + index = 0; /* safety check */ + } + if (index >= BARS_LEN) { + index = BARS_LEN -1; /* safety check */ + } + wattron (ctx->window, COLOR_PAIR(color)); + mvwprintw (ctx->window, + /* y = */ 3, + /* x = */ (1 + sequence) % maxx, + bars[index]); + wattroff (ctx->window, COLOR_PAIR(color)); + } + else + { + } + } + else { + wattron (ctx->window, COLOR_PAIR(OPING_RED) | A_BOLD); + mvwprintw (ctx->window, + /* y = */ 3, + /* x = */ (1 + sequence) % maxx, + "!"); + wattroff (ctx->window, COLOR_PAIR(OPING_RED) | A_BOLD); + } wrefresh (ctx->window); return (0); @@ -654,7 +718,7 @@ static int on_resize (pingobj_t *ping) /* {{{ */ if ((height < 1) || (width < 1)) return (EINVAL); - main_win_height = height - (4 * host_num); + main_win_height = height - (5 * host_num); wresize (main_win, main_win_height, /* width = */ width); /* Allow scrolling */ scrollok (main_win, TRUE); @@ -678,9 +742,9 @@ static int on_resize (pingobj_t *ping) /* {{{ */ delwin (context->window); context->window = NULL; } - context->window = newwin (/* height = */ 4, + context->window = newwin (/* height = */ 5, /* width = */ width, - /* y = */ main_win_height + (4 * context->index), + /* y = */ main_win_height + (5 * context->index), /* x = */ 0); } @@ -728,9 +792,12 @@ static int pre_loop_hook (pingobj_t *ping) /* {{{ */ init_pair (OPING_GREEN, COLOR_GREEN, /* default = */ 0); init_pair (OPING_YELLOW, COLOR_YELLOW, /* default = */ 0); init_pair (OPING_RED, COLOR_RED, /* default = */ 0); + init_pair (OPING_GREEN_HIST, COLOR_GREEN, COLOR_BLACK); + init_pair (OPING_YELLOW_HIST, COLOR_YELLOW, COLOR_GREEN); + init_pair (OPING_RED_HIST, COLOR_RED, COLOR_YELLOW); } - main_win_height = height - (4 * host_num); + main_win_height = height - (5 * host_num); main_win = newwin (/* height = */ main_win_height, /* width = */ width, /* y = */ 0, /* x = */ 0); @@ -757,9 +824,9 @@ static int pre_loop_hook (pingobj_t *ping) /* {{{ */ delwin (context->window); context->window = NULL; } - context->window = newwin (/* height = */ 4, + context->window = newwin (/* height = */ 5, /* width = */ width, - /* y = */ main_win_height + (4 * context->index), + /* y = */ main_win_height + (5 * context->index), /* x = */ 0); } @@ -885,26 +952,30 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ if (has_colors () == TRUE) { int color = OPING_GREEN; - float ratio = 0; - int index = 0; - - ratio = ( latency - context->latency_min ) / ( context->latency_max - context->latency_min ); - if (ratio > 2/3.0) { - color = OPING_RED; - } - else if (ratio > 1/3.0) { - color = OPING_YELLOW; - } - index = (int) (ratio * BARS_LEN * 3); /* 3 colors */ - /* HOST_PRINTF ("%%r%f-ia%d-", ratio, index); */ - index = index % (BARS_LEN-1); - /* HOST_PRINTF ("im%d-", index); */ - if (index < 0 || index >= BARS_LEN) { - index = 0; /* safety check */ - } - wattron (main_win, COLOR_PAIR(color)); - HOST_PRINTF (bars[index]); + double average = context_get_average (context); + double stddev = context_get_stddev (context); + + if ((latency < (average - (2 * stddev))) + || (latency > (average + (2 * stddev)))) + color = OPING_RED; + else if ((latency < (average - stddev)) + || (latency > (average + stddev))) + color = OPING_YELLOW; + + HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i ", + data_len, context->host, context->addr, + sequence, recv_ttl, + format_qos (recv_qos, recv_qos_str, sizeof (recv_qos_str))); + if ((recv_qos != 0) || (opt_send_qos != 0)) + { + HOST_PRINTF ("qos=%s ", + format_qos (recv_qos, recv_qos_str, sizeof (recv_qos_str))); + } + HOST_PRINTF ("time="); + wattron (main_win, COLOR_PAIR(color)); + HOST_PRINTF ("%.2f", latency); wattroff (main_win, COLOR_PAIR(color)); + HOST_PRINTF (" ms\n"); } else { @@ -928,9 +999,13 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ #if USE_NCURSES if (has_colors () == TRUE) { + HOST_PRINTF ("echo reply from %s (%s): icmp_seq=%u ", + context->host, context->addr, + sequence); wattron (main_win, COLOR_PAIR(OPING_RED) | A_BOLD); - HOST_PRINTF ("!"); + HOST_PRINTF ("timeout"); wattroff (main_win, COLOR_PAIR(OPING_RED) | A_BOLD); + HOST_PRINTF ("\n"); } else { @@ -944,7 +1019,7 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ } #if USE_NCURSES - update_stats_from_context (context); + update_stats_from_context (context, iter); wrefresh (main_win); #endif } /* }}} void update_host_hook */