Makefile: WARNINGS: add -Wdouble-promotion
[olsrd.git] / lib / httpinfo / src / admin_interface.c
1
2 /*
3  * HTTP Info plugin for the olsr.org OLSR daemon
4  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 /*
43  * Dynamic linked library for the olsr.org olsr daemon
44  */
45
46 #include "olsr.h"
47 #include "olsrd_httpinfo.h"
48 #include "olsr_cfg.h"
49 #include "admin_interface.h"
50 #include "net_olsr.h"
51 #include "ipcalc.h"
52
53 #include <stdio.h>
54 #include <string.h>
55 #include <stdlib.h>
56
57 #if 0
58 #define sprintf netsprintf
59 #define NETDIRECT
60 #endif
61
62 static const char admin_basic_setting_int[] =
63   "<td><strong>%s</strong></td><td><input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%d\"></td>\n";
64 static const char admin_basic_setting_float[] =
65   "<td><strong>%s</strong></td><td><input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%0.2f\"></td>\n";
66 static const char admin_basic_setting_string[] =
67   "<td><strong>%s</strong></td><td><input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%s\"></td>\n";
68
69 static const char admin_frame_prolog[] =
70   "<strong>Administrator interface</strong><hr>\n" "<h2>Change basic settings</h2>\n"
71   "<form action=\"set_values\" method=\"post\">\n" "<table width=\"100%%\">\n";
72
73 static const char admin_frame_mid[] =
74   "</table>\n<br>\n" "<center><input type=\"submit\" value=\"Submit\" class=\"input_button\">\n"
75   "<input type=\"reset\" value=\"Reset\" class=\"input_button\"></center>\n" "</form>\n" "<h2>Add/remove local HNA entries</h2>\n"
76   "<form action=\"set_values\" method=\"post\">\n" "<table width=\"100%%\"><tr><td><strong>Network:</strong></td>\n"
77   "<td><input type=\"text\" name=\"hna_new_net\" maxlength=\"16\" class=\"input_text\" value=\"0.0.0.0\"></td>\n"
78   "<td><strong>Netmask/Prefix:</strong></td>\n"
79   "<td><input type=\"text\" name=\"hna_new_netmask\" maxlength=\"16\" class=\"input_text\" value=\"0.0.0.0\"></td>\n"
80   "<td><input type=\"submit\" value=\"Add entry\" class=\"input_button\"></td></form>\n" "</table><hr>\n"
81   "<form action=\"set_values\" method=\"post\">\n" "<table width=\"100%%\">\n"
82   "<tr><th width=50 halign=\"middle\">Delete</th><th>Network</th><th>Netmask</th></tr>\n";
83
84 static const char admin_frame_epilog[] =
85   "</table>\n<br>\n" "<center><input type=\"submit\" value=\"Delete selected\" class=\"input_button\"></center>\n" "</form>\n";
86
87 int
88 build_admin_body(char *buf, uint32_t bufsize __attribute__ ((unused)))
89 {
90   int size = 0;
91   size += snprintf(&buf[size], bufsize - size, admin_frame_prolog);
92
93   size += snprintf(&buf[size], bufsize - size, "<tr>\n");
94
95   size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "Debug level:", "debug_level", 2, olsr_cnf->debug_level);
96   size += snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "Pollrate:", "pollrate", 4, (double)olsr_cnf->pollrate);
97   size += snprintf(&buf[size], bufsize - size, admin_basic_setting_string, "TOS:", "tos", 6, "TBD");
98
99   size += snprintf(&buf[size], bufsize - size, "</tr>\n" "<tr>\n");
100
101   size +=
102     snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "TC redundancy:", "tc_redundancy", 1, olsr_cnf->tc_redundancy);
103   size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "MPR coverage:", "mpr_coverage", 1, olsr_cnf->mpr_coverage);
104   size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "Willingness:", "willingness", 1, olsr_cnf->willingness);
105
106   size += snprintf(&buf[size], bufsize - size, "</tr>\n" "<tr>\n");
107
108   if (olsr_cnf->use_hysteresis) {
109     size +=
110       snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "Hyst scaling:", "hyst_scaling", 4,
111                   (double)olsr_cnf->hysteresis_param.scaling);
112
113     size +=
114       snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "Lower thr:", "hyst_lower", 4,
115                   (double)olsr_cnf->hysteresis_param.thr_low);
116     size +=
117       snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "Upper thr:", "hyst_upper", 4,
118                   (double)olsr_cnf->hysteresis_param.thr_high);
119   } else {
120     size += snprintf(&buf[size], bufsize - size, "<td>Hysteresis disabled</td>\n");
121   }
122
123   size += snprintf(&buf[size], bufsize - size, "</tr>\n" "<tr>\n");
124
125   if (olsr_cnf->lq_level) {
126     size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "LQ level:", "lq_level", 1, olsr_cnf->lq_level);
127     size += snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "LQ aging:", "lq_aging", 2, (double)olsr_cnf->lq_aging);
128   } else {
129     size += snprintf(&buf[size], bufsize - size, "<td>LQ disabled</td>\n");
130   }
131
132   size += snprintf(&buf[size], bufsize - size, "</tr>\n" "<tr>\n");
133   size += snprintf(&buf[size], bufsize - size, "</tr>\n");
134
135   size += snprintf(&buf[size], bufsize - size, admin_frame_mid);
136
137   if (olsr_cnf->hna_entries) {
138     struct ip_prefix_list *hna;
139     for (hna = olsr_cnf->hna_entries; hna; hna = hna->next) {
140       struct ipaddr_str netbuf;
141       olsr_ip_to_string(&netbuf, &hna->net.prefix);
142       size +=
143         snprintf(&buf[size], bufsize - size,
144                  "<tr><td halign=\"middle\"><input type=\"checkbox\" name=\"del_hna%s*%d\" class=\"input_checkbox\"></td><td>%s</td><td>%d</td></tr>\n",
145                  netbuf.buf, hna->net.prefix_len, netbuf.buf, hna->net.prefix_len);
146     }
147   }
148   size += snprintf(&buf[size], bufsize - size, admin_frame_epilog);
149   return size;
150 }
151
152 #ifdef ADMIN_INTERFACE
153
154 int
155 process_param(char *key, char *value)
156 {
157   static union olsr_ip_addr curr_hna_net;
158   static bool curr_hna_ok = false;
159
160   if (!strcmp(key, "debug_level")) {
161     int ival = atoi(value);
162     if ((ival < 0) || (ival > 9))
163       return -1;
164
165     olsr_cnf->debug_level = ival;
166     return 1;
167   }
168
169   if (!strcmp(key, "tc_redundancy")) {
170     int ival = atoi(value);
171     if ((ival < 0) || (ival > 3))
172       return -1;
173
174     olsr_cnf->tc_redundancy = ival;
175     return 1;
176   }
177
178   if (!strcmp(key, "mpr_coverage")) {
179     int ival = atoi(value);
180     if (ival < 0)
181       return -1;
182
183     olsr_cnf->mpr_coverage = ival;
184     return 1;
185   }
186
187   if (!strcmp(key, "willingness")) {
188     int ival = atoi(value);
189     if ((ival < 0) || (ival > 7))
190       return -1;
191
192     olsr_cnf->willingness = ival;
193     return 1;
194   }
195
196   if (!strcmp(key, "lq_level")) {
197     int ival = atoi(value);
198     if ((ival < 0) || (ival > 2))
199       return -1;
200
201     olsr_cnf->lq_level = ival;
202     return 1;
203   }
204
205   if (!strcmp(key, "lq_wsize")) {
206     int ival = atoi(value);
207     if ((ival < 0) || (ival > 10))
208       return -1;
209
210     olsr_cnf->lq_wsize = ival;
211     return 1;
212   }
213
214   if (!strcmp(key, "hyst_scaling")) {
215     float fval = 1.1;
216     sscanf(value, "%f", &fval);
217     if ((fval < 0.0) || (fval > 1.0))
218       return -1;
219
220     olsr_cnf->hysteresis_param.scaling = fval;
221     return 1;
222   }
223
224   if (!strcmp(key, "hyst_scaling")) {
225     float fval = 1.1;
226     sscanf(value, "%f", &fval);
227     if ((fval < 0.0) || (fval > 1.0))
228       return -1;
229
230     olsr_cnf->hysteresis_param.scaling = fval;
231     return 1;
232   }
233
234   if (!strcmp(key, "hyst_lower")) {
235     float fval = 1.1;
236     sscanf(value, "%f", &fval);
237     if ((fval < 0.0) || (fval > 1.0))
238       return -1;
239
240     olsr_cnf->hysteresis_param.thr_low = fval;
241     return 1;
242   }
243
244   if (!strcmp(key, "hyst_upper")) {
245     float fval = 1.1;
246     sscanf(value, "%f", &fval);
247     if ((fval < 0.0) || (fval > 1.0))
248       return -1;
249
250     olsr_cnf->hysteresis_param.thr_high = fval;
251     return 1;
252   }
253
254   if (!strcmp(key, "pollrate")) {
255     float fval = 1.1;
256     sscanf(value, "%f", &fval);
257     if ((fval < 0.0) || (fval > 1.0))
258       return -1;
259
260     olsr_cnf->pollrate = fval;
261     return 1;
262   }
263
264   if (!strcmp(key, "hna_new_net")) {
265     if (inet_pton(olsr_cnf->ipsize, value, &curr_hna_net.v4) == 0) {
266       fprintf(stderr, "Failed converting new HNA net %s\n", value);
267       return -1;
268     }
269     curr_hna_ok = true;
270     return 1;
271   }
272
273   if (!strcmp(key, "hna_new_netmask")) {
274     struct in_addr in;
275     uint8_t prefixlen;
276
277     if (!curr_hna_ok)
278       return -1;
279
280     curr_hna_ok = false;
281
282     if (inet_aton(value, &in) == 0) {
283       fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
284       return -1;
285     }
286     prefixlen = netmask_to_prefix((uint8_t *) & in, olsr_cnf->ipsize);
287     if (prefixlen == UCHAR_MAX) {
288       fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
289       return -1;
290     }
291     ip_prefix_list_add(&olsr_cnf->hna_entries, &curr_hna_net, prefixlen);
292     return 1;
293   }
294
295   if (!strncmp(key, "del_hna", 7) && !strcmp(value, "on")) {
296     struct in_addr net, mask;
297     char ip_net[16], ip_mask[16];
298     int seperator = 0;
299     uint8_t prefixlen;
300
301     while (key[7 + seperator] != '*') {
302       seperator++;
303     }
304     memcpy(ip_net, &key[7], seperator);
305     ip_net[seperator] = 0;
306     memcpy(ip_mask, &key[7 + seperator + 1], 16);
307     olsr_printf(1, "Deleting HNA %s/%s\n", ip_net, ip_mask);
308
309     if (inet_aton(ip_net, &net) == 0) {
310       fprintf(stderr, "Failed converting HNA net %s for deletion\n", ip_net);
311       return -1;
312     }
313
314     if (inet_aton(ip_mask, &mask) == 0) {
315       fprintf(stderr, "Failed converting HNA netmask %s for deletion\n", ip_mask);
316       return -1;
317     }
318     prefixlen = netmask_to_prefix((uint8_t *) & mask, olsr_cnf->ipsize);
319     if (prefixlen == UCHAR_MAX) {
320       fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
321       return -1;
322     }
323     ip_prefix_list_add(&olsr_cnf->hna_entries, &curr_hna_net, prefixlen);
324     return 1;
325   }
326
327   return 0;
328 #if 0
329   {
330   1, admin_basic_setting_string, "TOS:", "tos", 6, "TBD"}
331   ,
332 #endif
333 }
334
335 int
336 process_set_values(char *data, uint32_t data_size, char *buf, uint32_t bufsize __attribute__ ((unused)))
337 {
338   int size = 0;
339   int val_start, key_start;
340   uint32_t i;
341
342   size += sprintf(buf, "<html>\n<head><title>olsr.org httpinfo plugin</title></head>\n<body>\n");
343
344   key_start = 0;
345   val_start = 0;
346
347   for (i = 0; i < data_size; i++) {
348     if (data[i] == '=') {
349       data[i] = '\0';
350       val_start = i + 1;
351     }
352
353     if (data[i] == '&') {
354       data[i] = '\0';
355       if (!process_param(&data[key_start], &data[val_start])) {
356         size +=
357           snprintf(&buf[size], bufsize - size, "<h2>FAILED PROCESSING!</h2><br>Key: %s Value: %s<br>\n", &data[key_start],
358                    &data[val_start]);
359         return -1;
360       }
361
362       key_start = i + 1;
363     }
364   }
365
366   if (!process_param(&data[key_start], &data[val_start])) {
367     size +=
368       snprintf(&buf[size], bufsize - size, "<b>FAILED PROCESSING!</b><br>Key: %s Value: %s<br>\n", &data[key_start],
369                &data[val_start]);
370     return -1;
371   }
372
373   size +=
374     snprintf(&buf[size], bufsize - size,
375              "<h2>UPDATE SUCESSFULL!</h2><br>Press BACK and RELOAD in your browser to return to the plugin<br>\n</body>\n</html>\n");
376   size += snprintf(&buf[size], bufsize - size, "\n</body>\n</html>\n");
377
378   return size;
379 }
380 #endif
381
382 /*
383  * Local Variables:
384  * c-basic-offset: 2
385  * indent-tabs-mode: nil
386  * End:
387  */