55ae84c84e1bb7d4df08fe22a4d58a56054f57b8
[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       printf("HYST SCALING: %f\n", fval);
247       olsr_cnf->hysteresis_param.scaling = fval;
248       return 1;
249     }
250
251   if(!strcmp(key, "hyst_scaling"))
252     {
253       float fval = 1.1;
254       sscanf(value, "%f", &fval);
255       if((fval < 0.0) || (fval > 1.0))
256         return -1;
257
258       olsr_cnf->hysteresis_param.scaling = fval;
259       return 1;
260     }
261
262   if(!strcmp(key, "hyst_lower"))
263     {
264       float fval = 1.1;
265       sscanf(value, "%f", &fval);
266       if((fval < 0.0) || (fval > 1.0))
267         return -1;
268
269       olsr_cnf->hysteresis_param.thr_low = fval;
270       return 1;
271     }
272
273   if(!strcmp(key, "hyst_upper"))
274     {
275       float fval = 1.1;
276       sscanf(value, "%f", &fval);
277       if((fval < 0.0) || (fval > 1.0))
278         return -1;
279
280       olsr_cnf->hysteresis_param.thr_high = fval;
281       return 1;
282     }
283
284   if(!strcmp(key, "pollrate"))
285     {
286       float fval = 1.1;
287       sscanf(value, "%f", &fval);
288       if((fval < 0.0) || (fval > 1.0))
289         return -1;
290
291       olsr_cnf->pollrate = fval;
292       return 1;
293     }
294
295
296   if(!strcmp(key, "hna_new_net"))
297     {
298       if(inet_pton(olsr_cnf->ipsize, value, &curr_hna_net.v4) == 0)
299         {
300           fprintf(stderr, "Failed converting new HNA net %s\n", value);
301           return -1;
302         }
303       curr_hna_ok = OLSR_TRUE;
304       return 1;
305     }
306
307   if(!strcmp(key, "hna_new_netmask"))
308     {
309       struct in_addr in;
310       olsr_u8_t prefixlen;
311
312       if(!curr_hna_ok)
313         return -1;
314
315       curr_hna_ok = OLSR_FALSE;
316
317       if(inet_aton(value, &in) == 0) {
318         fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
319         return -1;
320       }
321       prefixlen = netmask_to_prefix((olsr_u8_t *)&in, olsr_cnf->ipsize);
322       if(prefixlen == UCHAR_MAX) {
323         fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
324         return -1;
325       }
326       ip_prefix_list_add(&olsr_cnf->hna_entries, &curr_hna_net, prefixlen);
327       return 1;
328     }
329
330   if(!strncmp(key, "del_hna", 7) && !strcmp(value, "on"))
331     {
332       struct in_addr net, mask;
333       char ip_net[16], ip_mask[16];
334       int seperator = 0;
335       olsr_u8_t prefixlen;
336
337       while(key[7 + seperator] != '*') {
338         seperator++;
339       }
340       strncpy(ip_net, &key[7], seperator);
341       ip_net[seperator] = 0;
342       strncpy(ip_mask, &key[7 + seperator + 1], 16);
343       olsr_printf(1, "Deleting HNA %s/%s\n", ip_net, ip_mask);
344
345       if(inet_aton(ip_net, &net) == 0)
346         {
347           fprintf(stderr, "Failed converting HNA net %s for deletion\n", ip_net);
348           return -1;
349         }
350
351       if(inet_aton(ip_mask, &mask) == 0) {
352         fprintf(stderr, "Failed converting HNA netmask %s for deletion\n", ip_mask);
353         return -1;
354       }
355       prefixlen = netmask_to_prefix((olsr_u8_t *)&mask, olsr_cnf->ipsize);
356       if(prefixlen == UCHAR_MAX) {
357         fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
358         return -1;
359       }
360       ip_prefix_list_add(&olsr_cnf->hna_entries, &curr_hna_net, prefixlen);
361       return 1;
362     }
363
364   return 0;
365 #if 0
366   { 1, admin_basic_setting_string, "TOS:", "tos", 6, "TBD" },
367 #endif
368 }
369
370 int
371 process_set_values(char *data, olsr_u32_t data_size, char *buf, olsr_u32_t bufsize __attribute__((unused)))
372 {
373   int size = 0;
374   int val_start, key_start;
375   olsr_u32_t i;
376
377   printf("Dynamic Data: %s\n", data);
378
379   size += sprintf(buf, "<html>\n<head><title>olsr.org httpinfo plugin</title></head>\n<body>\n");
380
381   key_start = 0;
382   val_start = 0;
383
384   for(i = 0; i < data_size; i++)
385     {
386       if(data[i] == '=')
387         {
388           data[i] = '\0';
389           val_start = i + 1;
390         }
391
392       if(data[i] == '&')
393         {
394           data[i] = '\0';
395           if(!process_param(&data[key_start], &data[val_start]))
396             {
397               size += snprintf(&buf[size], bufsize-size, "<h2>FAILED PROCESSING!</h2><br>Key: %s Value: %s<br>\n", 
398                               &data[key_start], &data[val_start]);
399               return -1;
400             }
401
402           printf("Key: %s\nValue: %s\n", 
403                  &data[key_start], &data[val_start]);
404           key_start = i + 1;
405         }
406     }  
407
408   if(!process_param(&data[key_start], &data[val_start]))
409     {
410       size += snprintf(&buf[size], bufsize-size, "<b>FAILED PROCESSING!</b><br>Key: %s Value: %s<br>\n", 
411                       &data[key_start], &data[val_start]);
412       return -1;
413     }
414
415   printf("Key: %s\nValue: %s\n", 
416          &data[key_start], &data[val_start]);
417
418   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");
419   size += snprintf(&buf[size], bufsize-size, "\n</body>\n</html>\n");
420
421   return size;
422 }
423 #endif