From Sven-Ola Tuecke: 104-olsrd-verysmallfix.patch
[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 T√łnnesen(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
47 #include "olsr.h"
48 #include "olsrd_httpinfo.h"
49 #include "olsr_cfg.h"
50 #include "admin_interface.h"
51 #include "net_olsr.h"
52 #include "ipcalc.h"
53
54 #include <stdio.h>
55 #include <string.h>
56 #include <stdlib.h>
57
58 #if 0
59 #define sprintf netsprintf
60 #define NETDIRECT
61 #endif
62
63 static const char admin_basic_setting_int[] = "<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[] = "<td><strong>%s</strong></td><td><input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%0.2f\"></td>\n";
65 static const char admin_basic_setting_string[] = "<td><strong>%s</strong></td><td><input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%s\"></td>\n";
66
67 static const char admin_frame_prolog[] =
68     "<strong>Administrator interface</strong><hr>\n"
69     "<h2>Change basic settings</h2>\n"
70     "<form action=\"set_values\" method=\"post\">\n"
71     "<table width=\"100%%\">\n";
72
73 static const char admin_frame_mid[] =
74     "</table>\n<br>\n"
75     "<center><input type=\"submit\" value=\"Submit\" class=\"input_button\">\n"
76     "<input type=\"reset\" value=\"Reset\" class=\"input_button\"></center>\n"
77     "</form>\n"
78     "<h2>Add/remove local HNA entries</h2>\n"
79     "<form action=\"set_values\" method=\"post\">\n"
80     "<table width=\"100%%\"><tr><td><strong>Network:</strong></td>\n"
81     "<td><input type=\"text\" name=\"hna_new_net\" maxlength=\"16\" class=\"input_text\" value=\"0.0.0.0\"></td>\n"
82     "<td><strong>Netmask/Prefix:</strong></td>\n"
83     "<td><input type=\"text\" name=\"hna_new_netmask\" maxlength=\"16\" class=\"input_text\" value=\"0.0.0.0\"></td>\n"
84     "<td><input type=\"submit\" value=\"Add entry\" class=\"input_button\"></td></form>\n"
85     "</table><hr>\n"
86     "<form action=\"set_values\" method=\"post\">\n"
87     "<table width=\"100%%\">\n"
88   "<tr><th width=50 halign=\"middle\">Delete</th><th>Network</th><th>Netmask</th></tr>\n";
89
90 static const char admin_frame_epilog[] =
91     "</table>\n<br>\n"
92     "<center><input type=\"submit\" value=\"Delete selected\" class=\"input_button\"></center>\n"
93     "</form>\n";
94
95 int
96 build_admin_body(char *buf, olsr_u32_t bufsize __attribute__((unused)))
97 {
98   int size = 0;
99   size += snprintf(&buf[size], bufsize-size, admin_frame_prolog);
100
101   size += snprintf(&buf[size], bufsize-size, "<tr>\n");
102
103   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
104                   "Debug level:", "debug_level", 2, olsr_cnf->debug_level);
105   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
106                   "Pollrate:", "pollrate", 4, olsr_cnf->pollrate);
107   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_string,
108                   "TOS:", "tos", 6, "TBD");
109
110   size += snprintf(&buf[size], bufsize-size, "</tr>\n"
111                                              "<tr>\n");
112
113   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
114                   "TC redundancy:", "tc_redundancy", 1, olsr_cnf->tc_redundancy);
115   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
116                   "MPR coverage:", "mpr_coverage", 1, olsr_cnf->mpr_coverage);
117   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
118                   "Willingness:", "willingness", 1, olsr_cnf->willingness);
119
120   size += snprintf(&buf[size], bufsize-size, "</tr>\n"
121                                              "<tr>\n");
122
123   if(olsr_cnf->use_hysteresis) {
124     size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
125                      "Hyst scaling:", "hyst_scaling", 4, olsr_cnf->hysteresis_param.scaling);
126
127     size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
128                      "Lower thr:", "hyst_lower", 4, olsr_cnf->hysteresis_param.thr_low);
129     size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
130                      "Upper thr:", "hyst_upper", 4, olsr_cnf->hysteresis_param.thr_high);
131   } else {
132     size += snprintf(&buf[size], bufsize-size, "<td>Hysteresis disabled</td>\n");
133   }
134
135   size += snprintf(&buf[size], bufsize-size, "</tr>\n"
136                                              "<tr>\n");
137   
138   if(olsr_cnf->lq_level) {
139     size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
140                      "LQ level:", "lq_level", 1, olsr_cnf->lq_level);
141     size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
142                      "LQ winsize:", "lq_wsize", 2, olsr_cnf->lq_wsize);
143   } else {
144     size += snprintf(&buf[size], bufsize-size, "<td>LQ disabled</td>\n");
145   }
146
147   size += snprintf(&buf[size], bufsize-size, "</tr>\n"
148                                              "<tr>\n");
149   size += snprintf(&buf[size], bufsize-size, "</tr>\n");
150   
151   size += snprintf(&buf[size], bufsize-size, admin_frame_mid);
152
153   if(olsr_cnf->hna_entries) {
154     struct ip_prefix_list *hna;
155     for(hna = olsr_cnf->hna_entries; hna; hna = hna->next) {
156       struct ipaddr_str netbuf;
157       olsr_ip_to_string(&netbuf, &hna->net.prefix);
158       size += snprintf(&buf[size], bufsize-size,
159                        "<tr><td halign=\"middle\"><input type=\"checkbox\" name=\"del_hna%s*%d\" class=\"input_checkbox\"></td><td>%s</td><td>%d</td></tr>\n",
160                        netbuf.buf,
161                        hna->net.prefix_len,
162                        netbuf.buf,
163                        hna->net.prefix_len);
164     }
165   }
166   size += snprintf(&buf[size], bufsize-size, admin_frame_epilog);
167   return size;
168 }
169
170
171 #ifdef ADMIN_INTERFACE
172
173 int
174 process_param(char *key, char *value)
175 {
176   static union olsr_ip_addr curr_hna_net;
177   static olsr_bool curr_hna_ok = OLSR_FALSE;
178
179   if(!strcmp(key, "debug_level"))
180     {
181       int ival = atoi(value);
182       if((ival < 0) || (ival > 9))
183         return -1;
184
185       olsr_cnf->debug_level = ival;
186       return 1;
187     }
188
189   if(!strcmp(key, "tc_redundancy"))
190     {
191       int ival = atoi(value);
192       if((ival < 0) || (ival > 3))
193         return -1;
194
195       olsr_cnf->tc_redundancy = ival;
196       return 1;
197     }
198
199   if(!strcmp(key, "mpr_coverage"))
200     {
201       int ival = atoi(value);
202       if(ival < 0)
203         return -1;
204
205       olsr_cnf->mpr_coverage = ival;
206       return 1;
207     }
208
209   if(!strcmp(key, "willingness"))
210     {
211       int ival = atoi(value);
212       if((ival < 0) || (ival > 7))
213         return -1;
214
215       olsr_cnf->willingness = ival;
216       return 1;
217     }
218
219   if(!strcmp(key, "lq_level"))
220     {
221       int ival = atoi(value);
222       if((ival < 0) || (ival > 2))
223         return -1;
224
225       olsr_cnf->lq_level = ival;
226       return 1;
227     }
228
229   if(!strcmp(key, "lq_wsize"))
230     {
231       int ival = atoi(value);
232       if((ival < 0) || (ival > 10))
233         return -1;
234
235       olsr_cnf->lq_wsize = ival;
236       return 1;
237     }
238
239   if(!strcmp(key, "hyst_scaling"))
240     {
241       float fval = 1.1;
242       sscanf(value, "%f", &fval);
243       if((fval < 0.0) || (fval > 1.0))
244         return -1;
245
246       olsr_cnf->hysteresis_param.scaling = fval;
247       return 1;
248     }
249
250   if(!strcmp(key, "hyst_scaling"))
251     {
252       float fval = 1.1;
253       sscanf(value, "%f", &fval);
254       if((fval < 0.0) || (fval > 1.0))
255         return -1;
256
257       olsr_cnf->hysteresis_param.scaling = fval;
258       return 1;
259     }
260
261   if(!strcmp(key, "hyst_lower"))
262     {
263       float fval = 1.1;
264       sscanf(value, "%f", &fval);
265       if((fval < 0.0) || (fval > 1.0))
266         return -1;
267
268       olsr_cnf->hysteresis_param.thr_low = fval;
269       return 1;
270     }
271
272   if(!strcmp(key, "hyst_upper"))
273     {
274       float fval = 1.1;
275       sscanf(value, "%f", &fval);
276       if((fval < 0.0) || (fval > 1.0))
277         return -1;
278
279       olsr_cnf->hysteresis_param.thr_high = fval;
280       return 1;
281     }
282
283   if(!strcmp(key, "pollrate"))
284     {
285       float fval = 1.1;
286       sscanf(value, "%f", &fval);
287       if((fval < 0.0) || (fval > 1.0))
288         return -1;
289
290       olsr_cnf->pollrate = fval;
291       return 1;
292     }
293
294
295   if(!strcmp(key, "hna_new_net"))
296     {
297       if(inet_pton(olsr_cnf->ipsize, value, &curr_hna_net.v4) == 0)
298         {
299           fprintf(stderr, "Failed converting new HNA net %s\n", value);
300           return -1;
301         }
302       curr_hna_ok = OLSR_TRUE;
303       return 1;
304     }
305
306   if(!strcmp(key, "hna_new_netmask"))
307     {
308       struct in_addr in;
309       olsr_u8_t prefixlen;
310
311       if(!curr_hna_ok)
312         return -1;
313
314       curr_hna_ok = OLSR_FALSE;
315
316       if(inet_aton(value, &in) == 0) {
317         fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
318         return -1;
319       }
320       prefixlen = netmask_to_prefix((olsr_u8_t *)&in, olsr_cnf->ipsize);
321       if(prefixlen == UCHAR_MAX) {
322         fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
323         return -1;
324       }
325       ip_prefix_list_add(&olsr_cnf->hna_entries, &curr_hna_net, prefixlen);
326       return 1;
327     }
328
329   if(!strncmp(key, "del_hna", 7) && !strcmp(value, "on"))
330     {
331       struct in_addr net, mask;
332       char ip_net[16], ip_mask[16];
333       int seperator = 0;
334       olsr_u8_t prefixlen;
335
336       while(key[7 + seperator] != '*') {
337         seperator++;
338       }
339       strncpy(ip_net, &key[7], seperator);
340       ip_net[seperator] = 0;
341       strncpy(ip_mask, &key[7 + seperator + 1], 16);
342       olsr_printf(1, "Deleting HNA %s/%s\n", ip_net, ip_mask);
343
344       if(inet_aton(ip_net, &net) == 0)
345         {
346           fprintf(stderr, "Failed converting HNA net %s for deletion\n", ip_net);
347           return -1;
348         }
349
350       if(inet_aton(ip_mask, &mask) == 0) {
351         fprintf(stderr, "Failed converting HNA netmask %s for deletion\n", ip_mask);
352         return -1;
353       }
354       prefixlen = netmask_to_prefix((olsr_u8_t *)&mask, olsr_cnf->ipsize);
355       if(prefixlen == UCHAR_MAX) {
356         fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
357         return -1;
358       }
359       ip_prefix_list_add(&olsr_cnf->hna_entries, &curr_hna_net, prefixlen);
360       return 1;
361     }
362
363   return 0;
364 #if 0
365   { 1, admin_basic_setting_string, "TOS:", "tos", 6, "TBD" },
366 #endif
367 }
368
369 int
370 process_set_values(char *data, olsr_u32_t data_size, char *buf, olsr_u32_t bufsize __attribute__((unused)))
371 {
372   int size = 0;
373   int val_start, key_start;
374   olsr_u32_t i;
375
376   size += sprintf(buf, "<html>\n<head><title>olsr.org httpinfo plugin</title></head>\n<body>\n");
377
378   key_start = 0;
379   val_start = 0;
380
381   for(i = 0; i < data_size; i++)
382     {
383       if(data[i] == '=')
384         {
385           data[i] = '\0';
386           val_start = i + 1;
387         }
388
389       if(data[i] == '&')
390         {
391           data[i] = '\0';
392           if(!process_param(&data[key_start], &data[val_start]))
393             {
394               size += snprintf(&buf[size], bufsize-size, "<h2>FAILED PROCESSING!</h2><br>Key: %s Value: %s<br>\n", 
395                               &data[key_start], &data[val_start]);
396               return -1;
397             }
398
399           key_start = i + 1;
400         }
401     }  
402
403   if(!process_param(&data[key_start], &data[val_start]))
404     {
405       size += snprintf(&buf[size], bufsize-size, "<b>FAILED PROCESSING!</b><br>Key: %s Value: %s<br>\n", 
406                       &data[key_start], &data[val_start]);
407       return -1;
408     }
409
410   size += snprintf(&buf[size], bufsize-size, "<h2>UPDATE SUCESSFULL!</h2><br>Press BACK and RELOAD in your browser to return to the plugin<br>\n</body>\n</html>\n");
411   size += snprintf(&buf[size], bufsize-size, "\n</body>\n</html>\n");
412
413   return size;
414 }
415 #endif