diff options
-rw-r--r-- | src/graph.c | 51 | ||||
-rw-r--r-- | src/grid.c | 3 | ||||
-rw-r--r-- | src/readconfig.c | 18 | ||||
-rw-r--r-- | src/tagr.h | 20 |
4 files changed, 72 insertions, 20 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; | |||
54 | int graph_h_margin[2] = { 100, 14 }; | 54 | int graph_h_margin[2] = { 100, 14 }; |
55 | int graph_v_margin[2] = { 14, 35 }; | 55 | int graph_v_margin[2] = { 14, 35 }; |
56 | 56 | ||
57 | /* FIXME: I18N?? */ | 57 | struct monitor default_monitor = { |
58 | char *rate_unit = "Bytes per Second"; | 58 | NULL, |
59 | NULL, | ||
60 | NULL, | ||
61 | "Bytes per Second", /* rate_unit, FIXME: I18N?? */ | ||
62 | 0, /* max_rate */ | ||
63 | 0, /* max_adjust */ | ||
64 | 1.0, /* scale */ | ||
65 | 0.1, /* ystep */ | ||
66 | 0, /* ystep_absolute */ | ||
67 | 0 /* swap */ | ||
68 | }; | ||
59 | 69 | ||
60 | #define make_color_index(g, ar) \ | 70 | #define make_color_index(g, ar) \ |
61 | gdImageColorAllocate (g, (ar)[0], (ar)[1], (ar)[2]) | 71 | gdImageColorAllocate (g, (ar)[0], (ar)[1], (ar)[2]) |
@@ -70,6 +80,24 @@ draw_vtext (gdImagePtr graph, int color, const char *text) | |||
70 | (unsigned char *) text, color); | 80 | (unsigned char *) text, color); |
71 | } | 81 | } |
72 | 82 | ||
83 | static double | ||
84 | find_max (queue_t *dataq) | ||
85 | { | ||
86 | int i, n = queue_count (dataq); | ||
87 | double mval = 0; | ||
88 | struct traffic_history *th; | ||
89 | |||
90 | for (i = 0; i < n; i++) | ||
91 | { | ||
92 | th = queue_get_ptr (dataq, i); | ||
93 | if (mval < th->inrate) | ||
94 | mval = th->inrate; | ||
95 | if (mval < th->outrate) | ||
96 | mval = th->outrate; | ||
97 | } | ||
98 | return mval; | ||
99 | } | ||
100 | |||
73 | int | 101 | int |
74 | draw_graph (FILE *fp, | 102 | draw_graph (FILE *fp, |
75 | struct monitor *mon, | 103 | struct monitor *mon, |
@@ -89,13 +117,25 @@ draw_graph (FILE *fp, | |||
89 | int full_xsize = graph_xsize + graph_h_margin[0] + graph_h_margin[1]; | 117 | int full_xsize = graph_xsize + graph_h_margin[0] + graph_h_margin[1]; |
90 | int full_ysize = graph_ysize + graph_v_margin[0] + graph_v_margin[1]; | 118 | int full_ysize = graph_ysize + graph_v_margin[0] + graph_v_margin[1]; |
91 | grid_t grid; | 119 | grid_t grid; |
92 | double ymax = mon->max_rate; | 120 | double ymax; |
121 | |||
122 | if (mon->max_adjust) | ||
123 | { | ||
124 | double amax = find_max (dataq); | ||
125 | if (amax > mon->max_rate) | ||
126 | { | ||
127 | unsigned long n = (amax - mon->max_rate + mon->max_adjust - 1) / | ||
128 | mon->max_adjust; | ||
129 | mon->max_rate += n * mon->max_adjust; | ||
130 | } | ||
131 | } | ||
132 | ymax = mon->max_rate; | ||
93 | 133 | ||
94 | yscale = (double) graph_ysize / ymax; | 134 | yscale = (double) graph_ysize / ymax; |
95 | xscale = (double) graph_xsize / xmax; | 135 | xscale = (double) graph_xsize / xmax; |
96 | 136 | ||
97 | #define ytr(y) \ | 137 | #define ytr(y) \ |
98 | (unsigned long) ((ymax >= (y) ? (ymax - (y)) : ymax) * \ | 138 | (unsigned long) ((ymax >= (y) ? (ymax - (y)) : 0) * \ |
99 | yscale + graph_h_margin[1]) | 139 | yscale + graph_h_margin[1]) |
100 | #define xtr(x) \ | 140 | #define xtr(x) \ |
101 | (unsigned long) (growright ? \ | 141 | (unsigned long) (growright ? \ |
@@ -213,8 +253,7 @@ draw_graph (FILE *fp, | |||
213 | double d; | 253 | double d; |
214 | char *str = NULL; | 254 | char *str = NULL; |
215 | 255 | ||
216 | draw_vtext (graph, i_grid, | 256 | draw_vtext (graph, i_grid, mon->rate_unit); |
217 | mon->rate_unit ? mon->rate_unit : rate_unit); | ||
218 | 257 | ||
219 | /* Draw vertical grid */ | 258 | /* Draw vertical grid */ |
220 | while ((d = grid_next (grid, &str, NULL)) < ymax) | 259 | while ((d = grid_next (grid, &str, NULL)) < ymax) |
@@ -95,7 +95,10 @@ ygrid_create (grid_t grid, void *cdata) | |||
95 | { | 95 | { |
96 | struct monitor *mon = cdata; | 96 | struct monitor *mon = cdata; |
97 | struct ygrid_data *gr = xmalloc (sizeof (*gr)); | 97 | struct ygrid_data *gr = xmalloc (sizeof (*gr)); |
98 | if (mon->ystep_absolute) | ||
98 | gr->step = mon->ystep; | 99 | gr->step = mon->ystep; |
100 | else | ||
101 | gr->step = mon->ystep * mon->max_rate; | ||
99 | return gr; | 102 | return gr; |
100 | } | 103 | } |
101 | 104 | ||
diff --git a/src/readconfig.c b/src/readconfig.c index 1c22cb1..a60f19d 100644 --- a/src/readconfig.c +++ b/src/readconfig.c | |||
@@ -98,15 +98,20 @@ cb_monitor (enum grecs_callback_command cmd, | |||
98 | return 1; | 98 | return 1; |
99 | } | 99 | } |
100 | mon = xzalloc (sizeof (*mon)); | 100 | mon = xzalloc (sizeof (*mon)); |
101 | *mon = default_monitor; | ||
101 | mon->id = strdup (value->v.string); | 102 | mon->id = strdup (value->v.string); |
102 | mon->scale = 1.0; | 103 | mon->name = NULL; |
103 | mon->ystep = 100.; | 104 | mon->dir = NULL; |
104 | *pdata = mon; | 105 | *pdata = mon; |
105 | break; | 106 | break; |
106 | 107 | ||
107 | case grecs_callback_section_end: | 108 | case grecs_callback_section_end: |
108 | mon = *pdata; | 109 | mon = *pdata; |
109 | if (mon->max_rate == 0) | 110 | if (strcmp (mon->id, "default") == 0) |
111 | default_monitor = *mon; | ||
112 | else | ||
113 | { | ||
114 | if (mon->max_rate == 0 && mon->max_adjust == 0) | ||
110 | { | 115 | { |
111 | grecs_error (locus, 0, _("maximum speed not set")); | 116 | grecs_error (locus, 0, _("maximum speed not set")); |
112 | free (mon); | 117 | free (mon); |
@@ -121,6 +126,7 @@ cb_monitor (enum grecs_callback_command cmd, | |||
121 | 126 | ||
122 | obstack_grow (&mon_stack, mon, sizeof *mon); | 127 | obstack_grow (&mon_stack, mon, sizeof *mon); |
123 | mon_count++; | 128 | mon_count++; |
129 | } | ||
124 | free (mon); | 130 | free (mon); |
125 | *pdata = NULL; | 131 | *pdata = NULL; |
126 | break; | 132 | break; |
@@ -174,6 +180,8 @@ static struct grecs_keyword monitor_kw[] = { | |||
174 | grecs_type_string, NULL, offsetof(struct monitor, dir) }, | 180 | grecs_type_string, NULL, offsetof(struct monitor, dir) }, |
175 | { "max-speed", NULL, N_("Maximum speed"), | 181 | { "max-speed", NULL, N_("Maximum speed"), |
176 | grecs_type_ulong, NULL, offsetof(struct monitor, max_rate) }, | 182 | grecs_type_ulong, NULL, offsetof(struct monitor, max_rate) }, |
183 | { "max-adjust", NULL, N_("Adjust maximum by this value when needed"), | ||
184 | grecs_type_ulong, NULL, offsetof(struct monitor, max_adjust) }, | ||
177 | { "rate-units", NULL, N_("Name of rate units"), | 185 | { "rate-units", NULL, N_("Name of rate units"), |
178 | grecs_type_string, NULL, offsetof(struct monitor, rate_unit) }, | 186 | grecs_type_string, NULL, offsetof(struct monitor, rate_unit) }, |
179 | { "scale", N_("arg: double"), N_("Scaling factor"), | 187 | { "scale", N_("arg: double"), N_("Scaling factor"), |
@@ -182,6 +190,8 @@ static struct grecs_keyword monitor_kw[] = { | |||
182 | { "y-step", N_("arg: double"), N_("Step for Y axis"), | 190 | { "y-step", N_("arg: double"), N_("Step for Y axis"), |
183 | grecs_type_string, NULL, offsetof(struct monitor, ystep), | 191 | grecs_type_string, NULL, offsetof(struct monitor, ystep), |
184 | cb_double}, | 192 | cb_double}, |
193 | { "y-step-absolute", NULL, N_("y-step is an absolute value"), | ||
194 | grecs_type_bool, NULL, offsetof(struct monitor, ystep_absolute) }, | ||
185 | { "swap", NULL, N_("Swap in and out rates"), | 195 | { "swap", NULL, N_("Swap in and out rates"), |
186 | grecs_type_bool, NULL, offsetof(struct monitor, swap) }, | 196 | grecs_type_bool, NULL, offsetof(struct monitor, swap) }, |
187 | { NULL } | 197 | { NULL } |
@@ -488,8 +498,6 @@ static struct grecs_keyword tagr_kw[] = { | |||
488 | N_("Idle timeout for stream connections"), | 498 | N_("Idle timeout for stream connections"), |
489 | grecs_type_uint, &stream_idle_timeout }, | 499 | grecs_type_uint, &stream_idle_timeout }, |
490 | 500 | ||
491 | { "rate-units", NULL, N_("Name of rate units"), | ||
492 | grecs_type_string, &rate_unit }, | ||
493 | { "number-suffixes", N_("suffixes"), | 501 | { "number-suffixes", N_("suffixes"), |
494 | N_("Not implemented") /* FIXME */, | 502 | N_("Not implemented") /* FIXME */, |
495 | grecs_type_string, NULL, 0, cb_number_suffixes }, | 503 | grecs_type_string, NULL, 0, cb_number_suffixes }, |
@@ -43,14 +43,16 @@ | |||
43 | 43 | ||
44 | struct monitor | 44 | struct monitor |
45 | { | 45 | { |
46 | char *id; | 46 | char *id; /* Monitor ID */ |
47 | char *name; | 47 | char *name; /* Full name */ |
48 | char *dir; | 48 | char *dir; /* Output directory */ |
49 | char *rate_unit; | 49 | char *rate_unit; /* Rate units */ |
50 | unsigned long max_rate; | 50 | unsigned long max_rate; /* Max. rate value */ |
51 | double scale; | 51 | unsigned long max_adjust; /* Adjustment for max. rate */ |
52 | double ystep; | 52 | double scale; /* Y (rate) scale */ |
53 | int swap; | 53 | double ystep; /* Step of Y grid, in fractions of max_rate */ |
54 | int ystep_absolute; /* When true, ystep is an absolute value */ | ||
55 | int swap; /* Swap input and output rates */ | ||
54 | }; | 56 | }; |
55 | 57 | ||
56 | extern int preprocess_only; | 58 | extern int preprocess_only; |
@@ -75,8 +77,8 @@ extern char *html_template; | |||
75 | extern char *html_input_file; | 77 | extern char *html_input_file; |
76 | extern int html_input_line; | 78 | extern int html_input_line; |
77 | extern int verbose_level; | 79 | extern int verbose_level; |
78 | extern char *rate_unit; | ||
79 | 80 | ||
81 | extern struct monitor default_monitor; | ||
80 | extern int percent_option; | 82 | extern int percent_option; |
81 | extern int transparent_option; | 83 | extern int transparent_option; |
82 | extern int zero_unknown_option; | 84 | extern int zero_unknown_option; |