diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-05-30 12:57:16 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-05-30 12:57:16 +0300 |
commit | 2a6ef4f51500091e535b2b47d709eee5cd52468c (patch) | |
tree | e3e28622c41b8b477acf1f2be6db9955b7ab4c6b /src | |
parent | fbc8bdac6efb0c63a73c5105bbf4ecb304187e44 (diff) | |
download | tagr-2a6ef4f51500091e535b2b47d709eee5cd52468c.tar.gz tagr-2a6ef4f51500091e535b2b47d709eee5cd52468c.tar.bz2 |
* src/graph.c (default_monitor): New global.
(find_max): New function.
(draw_graph): Adjust max rate if requested.
* src/grid.c (ygrid_create): Use mon->ystep_absolute
to determine the type of grid.
* src/readconfig.c (cb_monitor): Handle `monitor default'.
(monitor_kw): New statements: max-adjust and y-step-absolute.
(tagr_kw): Remove rate-units kw.
* src/tagr.h (struct monitor): New members: max_adjust and
ystep_absolute.
(default_monitor): New extern.
Diffstat (limited to 'src')
-rw-r--r-- | src/graph.c | 51 | ||||
-rw-r--r-- | src/grid.c | 5 | ||||
-rw-r--r-- | src/readconfig.c | 42 | ||||
-rw-r--r-- | src/tagr.h | 20 |
4 files changed, 85 insertions, 33 deletions
diff --git a/src/graph.c b/src/graph.c index 80b2a97..89f02a1 100644 --- a/src/graph.c +++ b/src/graph.c @@ -54,8 +54,18 @@ int graph_ysize = 100; int graph_h_margin[2] = { 100, 14 }; int graph_v_margin[2] = { 14, 35 }; -/* FIXME: I18N?? */ -char *rate_unit = "Bytes per Second"; +struct monitor default_monitor = { + NULL, + NULL, + NULL, + "Bytes per Second", /* rate_unit, FIXME: I18N?? */ + 0, /* max_rate */ + 0, /* max_adjust */ + 1.0, /* scale */ + 0.1, /* ystep */ + 0, /* ystep_absolute */ + 0 /* swap */ +}; #define make_color_index(g, ar) \ gdImageColorAllocate (g, (ar)[0], (ar)[1], (ar)[2]) @@ -70,6 +80,24 @@ draw_vtext (gdImagePtr graph, int color, const char *text) (unsigned char *) text, color); } +static double +find_max (queue_t *dataq) +{ + int i, n = queue_count (dataq); + double mval = 0; + struct traffic_history *th; + + for (i = 0; i < n; i++) + { + th = queue_get_ptr (dataq, i); + if (mval < th->inrate) + mval = th->inrate; + if (mval < th->outrate) + mval = th->outrate; + } + return mval; +} + int draw_graph (FILE *fp, struct monitor *mon, @@ -89,13 +117,25 @@ draw_graph (FILE *fp, int full_xsize = graph_xsize + graph_h_margin[0] + graph_h_margin[1]; int full_ysize = graph_ysize + graph_v_margin[0] + graph_v_margin[1]; grid_t grid; - double ymax = mon->max_rate; + double ymax; + + if (mon->max_adjust) + { + double amax = find_max (dataq); + if (amax > mon->max_rate) + { + unsigned long n = (amax - mon->max_rate + mon->max_adjust - 1) / + mon->max_adjust; + mon->max_rate += n * mon->max_adjust; + } + } + ymax = mon->max_rate; yscale = (double) graph_ysize / ymax; xscale = (double) graph_xsize / xmax; #define ytr(y) \ - (unsigned long) ((ymax >= (y) ? (ymax - (y)) : ymax) * \ + (unsigned long) ((ymax >= (y) ? (ymax - (y)) : 0) * \ yscale + graph_h_margin[1]) #define xtr(x) \ (unsigned long) (growright ? \ @@ -213,8 +253,7 @@ draw_graph (FILE *fp, double d; char *str = NULL; - draw_vtext (graph, i_grid, - mon->rate_unit ? mon->rate_unit : rate_unit); + draw_vtext (graph, i_grid, mon->rate_unit); /* Draw vertical grid */ while ((d = grid_next (grid, &str, NULL)) < ymax) @@ -95,7 +95,10 @@ ygrid_create (grid_t grid, void *cdata) { struct monitor *mon = cdata; struct ygrid_data *gr = xmalloc (sizeof (*gr)); - gr->step = mon->ystep; + if (mon->ystep_absolute) + gr->step = mon->ystep; + else + gr->step = mon->ystep * mon->max_rate; return gr; } diff --git a/src/readconfig.c b/src/readconfig.c index 1c22cb1..a60f19d 100644 --- a/src/readconfig.c +++ b/src/readconfig.c @@ -98,29 +98,35 @@ cb_monitor (enum grecs_callback_command cmd, return 1; } mon = xzalloc (sizeof (*mon)); + *mon = default_monitor; mon->id = strdup (value->v.string); - mon->scale = 1.0; - mon->ystep = 100.; + mon->name = NULL; + mon->dir = NULL; *pdata = mon; break; case grecs_callback_section_end: mon = *pdata; - if (mon->max_rate == 0) + if (strcmp (mon->id, "default") == 0) + default_monitor = *mon; + else { - grecs_error (locus, 0, _("maximum speed not set")); - free (mon); - return 0; + if (mon->max_rate == 0 && mon->max_adjust == 0) + { + grecs_error (locus, 0, _("maximum speed not set")); + free (mon); + return 0; + } + if (!mon->name) + mon->name = strdup (mon->id); + if (!mon->dir) + mon->dir = strdup (mon->id); + if (mon_count == 0) + obstack_init (&mon_stack); + + obstack_grow (&mon_stack, mon, sizeof *mon); + mon_count++; } - if (!mon->name) - mon->name = strdup (mon->id); - if (!mon->dir) - mon->dir = strdup (mon->id); - if (mon_count == 0) - obstack_init (&mon_stack); - - obstack_grow (&mon_stack, mon, sizeof *mon); - mon_count++; free (mon); *pdata = NULL; break; @@ -174,6 +180,8 @@ static struct grecs_keyword monitor_kw[] = { grecs_type_string, NULL, offsetof(struct monitor, dir) }, { "max-speed", NULL, N_("Maximum speed"), grecs_type_ulong, NULL, offsetof(struct monitor, max_rate) }, + { "max-adjust", NULL, N_("Adjust maximum by this value when needed"), + grecs_type_ulong, NULL, offsetof(struct monitor, max_adjust) }, { "rate-units", NULL, N_("Name of rate units"), grecs_type_string, NULL, offsetof(struct monitor, rate_unit) }, { "scale", N_("arg: double"), N_("Scaling factor"), @@ -182,6 +190,8 @@ static struct grecs_keyword monitor_kw[] = { { "y-step", N_("arg: double"), N_("Step for Y axis"), grecs_type_string, NULL, offsetof(struct monitor, ystep), cb_double}, + { "y-step-absolute", NULL, N_("y-step is an absolute value"), + grecs_type_bool, NULL, offsetof(struct monitor, ystep_absolute) }, { "swap", NULL, N_("Swap in and out rates"), grecs_type_bool, NULL, offsetof(struct monitor, swap) }, { NULL } @@ -488,8 +498,6 @@ static struct grecs_keyword tagr_kw[] = { N_("Idle timeout for stream connections"), grecs_type_uint, &stream_idle_timeout }, - { "rate-units", NULL, N_("Name of rate units"), - grecs_type_string, &rate_unit }, { "number-suffixes", N_("suffixes"), N_("Not implemented") /* FIXME */, grecs_type_string, NULL, 0, cb_number_suffixes }, @@ -43,14 +43,16 @@ struct monitor { - char *id; - char *name; - char *dir; - char *rate_unit; - unsigned long max_rate; - double scale; - double ystep; - int swap; + char *id; /* Monitor ID */ + char *name; /* Full name */ + char *dir; /* Output directory */ + char *rate_unit; /* Rate units */ + unsigned long max_rate; /* Max. rate value */ + unsigned long max_adjust; /* Adjustment for max. rate */ + double scale; /* Y (rate) scale */ + double ystep; /* Step of Y grid, in fractions of max_rate */ + int ystep_absolute; /* When true, ystep is an absolute value */ + int swap; /* Swap input and output rates */ }; extern int preprocess_only; @@ -75,8 +77,8 @@ extern char *html_template; extern char *html_input_file; extern int html_input_line; extern int verbose_level; -extern char *rate_unit; +extern struct monitor default_monitor; extern int percent_option; extern int transparent_option; extern int zero_unknown_option; |