cleanup, 1. step (to get some local changes away):
[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  * $Id: admin_interface.c,v 1.8 2007/04/20 14:06:18 bernd67 Exp $
41  */
42
43 /*
44  * Dynamic linked library for the olsr.org olsr daemon
45  */
46
47
48 #include "olsr.h"
49 #include "olsrd_httpinfo.h"
50 #include "olsr_cfg.h"
51 #include "admin_html.h"
52 #include "admin_interface.h"
53 #include "local_hna_set.h" /* add_local_hna4_entry() */
54
55 #include <stdio.h>
56 #include <string.h>
57 #include <stdlib.h>
58
59 #if 0
60 extern int netsprintf(char *str, const char* format, ...);
61 #define sprintf netsprintf
62 #define NETDIRECT
63 #endif
64
65
66 int
67 build_admin_body(char *buf, olsr_u32_t bufsize __attribute__((unused)))
68 {
69   int size = 0, i = 0;
70
71   while(admin_frame[i] && strcmp(admin_frame[i], "<!-- BASICSETTINGS -->\n"))
72     {
73       size += snprintf(&buf[size], bufsize-size, admin_frame[i]);
74       i++;
75     }
76   
77   if(!admin_frame[i])
78     return size;
79
80
81   size += snprintf(&buf[size], bufsize-size, "<tr>\n");
82
83   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
84                   "Debug level:", "debug_level", 2, olsr_cnf->debug_level);
85   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
86                   "Pollrate:", "pollrate", 4, olsr_cnf->pollrate);
87   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_string,
88                   "TOS:", "tos", 6, "TBD");
89
90   size += snprintf(&buf[size], bufsize-size, "</tr>\n");
91   size += snprintf(&buf[size], bufsize-size, "<tr>\n");
92
93   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
94                   "TC redundancy:", "tc_redundancy", 1, olsr_cnf->tc_redundancy);
95   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
96                   "MPR coverage:", "mpr_coverage", 1, olsr_cnf->mpr_coverage);
97   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
98                   "Willingness:", "willingness", 1, olsr_cnf->willingness);
99
100   size += snprintf(&buf[size], bufsize-size, "</tr>\n");
101   size += snprintf(&buf[size], bufsize-size, "<tr>\n");
102
103   if(olsr_cnf->use_hysteresis)
104     {
105       size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
106                       "Hyst scaling:", "hyst_scaling", 4, olsr_cnf->hysteresis_param.scaling);
107
108       size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
109                       "Lower thr:", "hyst_lower", 4, olsr_cnf->hysteresis_param.thr_low);
110       size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
111                       "Upper thr:", "hyst_upper", 4, olsr_cnf->hysteresis_param.thr_high);
112     }
113   else
114     {
115       size += snprintf(&buf[size], bufsize-size, "<td>Hysteresis disabled</td>\n");
116     }
117
118   size += snprintf(&buf[size], bufsize-size, "</tr>\n");
119   size += snprintf(&buf[size], bufsize-size, "<tr>\n");
120   
121   if(olsr_cnf->lq_level)
122     {
123       size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
124                       "LQ level:", "lq_level", 1, olsr_cnf->lq_level);
125       size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
126                       "LQ winsize:", "lq_wsize", 2, olsr_cnf->lq_wsize);
127     }
128   else
129     {
130       size += snprintf(&buf[size], bufsize-size, "<td>LQ disabled</td>\n");
131     }
132
133
134   size += snprintf(&buf[size], bufsize-size, "</tr>\n");
135   size += snprintf(&buf[size], bufsize-size, "<tr>\n");
136
137   size += snprintf(&buf[size], bufsize-size, "</tr>\n");
138   
139   i++;
140
141   while(admin_frame[i] && strcmp(admin_frame[i], "<!-- HNAENTRIES -->\n"))
142     {
143       size += snprintf(&buf[size], bufsize-size, admin_frame[i]);
144       i++;
145     }
146
147   if(!admin_frame[i] || !admin_frame[i+1])
148     return size;
149
150   i++;
151
152   if((olsr_cnf->ip_version == AF_INET) && (olsr_cnf->hna4_entries))
153     {
154       struct hna4_entry *hna4;
155       
156       for(hna4 = olsr_cnf->hna4_entries; hna4; hna4 = hna4->next)
157         {
158           size += snprintf(&buf[size], bufsize-size, admin_frame[i], 
159                           olsr_ip_to_string((union olsr_ip_addr *)&hna4->net),
160                           olsr_ip_to_string((union olsr_ip_addr *)&hna4->netmask),
161                           olsr_ip_to_string((union olsr_ip_addr *)&hna4->net),
162                           olsr_ip_to_string((union olsr_ip_addr *)&hna4->netmask));
163         }
164     }
165   else if((olsr_cnf->ip_version == AF_INET6) && (olsr_cnf->hna6_entries))
166     {
167       struct hna6_entry *hna6;
168         
169       for(hna6 = olsr_cnf->hna6_entries; hna6; hna6 = hna6->next)
170         {
171           size += snprintf(&buf[size], bufsize-size, admin_frame[i], 
172                           olsr_ip_to_string((union olsr_ip_addr *)&hna6->net),
173                           "TBD"/*hna6->prefix_len*/);
174         }
175     }
176   
177   i++;
178
179   while(admin_frame[i])
180     {
181       size += snprintf(&buf[size], bufsize-size, admin_frame[i]);
182       i++;
183     }
184   
185   return size;
186 }
187
188
189 #ifdef ADMIN_INTERFACE
190
191 int
192 process_param(char *key, char *value)
193 {
194   static olsr_u32_t curr_hna_net;
195   static olsr_bool curr_hna_ok = OLSR_FALSE;
196
197   if(!strcmp(key, "debug_level"))
198     {
199       int ival = atoi(value);
200       if((ival < 0) || (ival > 9))
201         return -1;
202
203       olsr_cnf->debug_level = ival;
204       return 1;
205     }
206
207   if(!strcmp(key, "tc_redundancy"))
208     {
209       int ival = atoi(value);
210       if((ival < 0) || (ival > 3))
211         return -1;
212
213       olsr_cnf->tc_redundancy = ival;
214       return 1;
215     }
216
217   if(!strcmp(key, "mpr_coverage"))
218     {
219       int ival = atoi(value);
220       if(ival < 0)
221         return -1;
222
223       olsr_cnf->mpr_coverage = ival;
224       return 1;
225     }
226
227   if(!strcmp(key, "willingness"))
228     {
229       int ival = atoi(value);
230       if((ival < 0) || (ival > 7))
231         return -1;
232
233       olsr_cnf->willingness = ival;
234       return 1;
235     }
236
237   if(!strcmp(key, "lq_level"))
238     {
239       int ival = atoi(value);
240       if((ival < 0) || (ival > 2))
241         return -1;
242
243       olsr_cnf->lq_level = ival;
244       return 1;
245     }
246
247   if(!strcmp(key, "lq_wsize"))
248     {
249       int ival = atoi(value);
250       if((ival < 0) || (ival > 10))
251         return -1;
252
253       olsr_cnf->lq_wsize = ival;
254       return 1;
255     }
256
257   if(!strcmp(key, "hyst_scaling"))
258     {
259       float fval = 1.1;
260       sscanf(value, "%f", &fval);
261       if((fval < 0.0) || (fval > 1.0))
262         return -1;
263
264       printf("HYST SCALING: %f\n", fval);
265       olsr_cnf->hysteresis_param.scaling = fval;
266       return 1;
267     }
268
269   if(!strcmp(key, "hyst_scaling"))
270     {
271       float fval = 1.1;
272       sscanf(value, "%f", &fval);
273       if((fval < 0.0) || (fval > 1.0))
274         return -1;
275
276       olsr_cnf->hysteresis_param.scaling = fval;
277       return 1;
278     }
279
280   if(!strcmp(key, "hyst_lower"))
281     {
282       float fval = 1.1;
283       sscanf(value, "%f", &fval);
284       if((fval < 0.0) || (fval > 1.0))
285         return -1;
286
287       olsr_cnf->hysteresis_param.thr_low = fval;
288       return 1;
289     }
290
291   if(!strcmp(key, "hyst_upper"))
292     {
293       float fval = 1.1;
294       sscanf(value, "%f", &fval);
295       if((fval < 0.0) || (fval > 1.0))
296         return -1;
297
298       olsr_cnf->hysteresis_param.thr_high = fval;
299       return 1;
300     }
301
302   if(!strcmp(key, "pollrate"))
303     {
304       float fval = 1.1;
305       sscanf(value, "%f", &fval);
306       if((fval < 0.0) || (fval > 1.0))
307         return -1;
308
309       olsr_cnf->pollrate = fval;
310       return 1;
311     }
312
313
314   if(!strcmp(key, "hna_new_net"))
315     {
316       struct in_addr in;
317
318       if(inet_aton(value, &in) == 0)
319         {
320           fprintf(stderr, "Failed converting new HNA net %s\n", value);
321           return -1;
322         }
323       curr_hna_ok = OLSR_TRUE;
324       curr_hna_net = in.s_addr;
325       return 1;
326     }
327
328   if(!strcmp(key, "hna_new_netmask"))
329     {
330       struct in_addr in;
331
332       if(!curr_hna_ok)
333         return -1;
334
335       curr_hna_ok = OLSR_FALSE;
336
337       if(inet_aton(value, &in) == 0)
338         {
339           fprintf(stderr, "Failed converting new HNA netmask %s\n", value);
340           return -1;
341         }
342       add_local_hna4_entry((union olsr_ip_addr *)&curr_hna_net,
343                            (union olsr_ip_addr *)&in.s_addr);
344       
345       return 1;
346     }
347
348   if(!strncmp(key, "del_hna", 7) && !strcmp(value, "on"))
349     {
350       struct in_addr net, mask;
351       char ip_net[16], ip_mask[16];
352       int seperator = 0;
353
354       while(key[7 + seperator] != '*')
355         seperator++;
356
357       strncpy(ip_net, &key[7], seperator);
358       ip_net[seperator] = 0;
359       strncpy(ip_mask, &key[7 + seperator + 1], 16);
360       olsr_printf(1, "Deleting HNA %s/%s\n", ip_net, ip_mask);
361
362       if(inet_aton(ip_net, &net) == 0)
363         {
364           fprintf(stderr, "Failed converting HNA net %s for deletion\n", ip_net);
365           return -1;
366         }
367
368       if(inet_aton(ip_mask, &mask) == 0)
369         {
370           fprintf(stderr, "Failed converting HNA netmask %s for deletion\n", ip_mask);
371           return -1;
372         }
373
374       remove_local_hna4_entry((union olsr_ip_addr *)&net.s_addr,
375                               (union olsr_ip_addr *)&mask.s_addr);
376
377       return 1;
378     }
379
380   return 0;
381 #if 0
382   { 1, admin_basic_setting_string, "TOS:", "tos", 6, "TBD" },
383 #endif
384 }
385
386 int
387 process_set_values(char *data, olsr_u32_t data_size, char *buf, olsr_u32_t bufsize __attribute__((unused)))
388 {
389   int size = 0;
390   int val_start, key_start;
391   olsr_u32_t i;
392
393   printf("Dynamic Data: %s\n", data);
394
395   size += sprintf(buf, "<html>\n<head><title>olsr.org httpinfo plugin</title></head>\n<body>\n");
396
397   key_start = 0;
398   val_start = 0;
399
400   for(i = 0; i < data_size; i++)
401     {
402       if(data[i] == '=')
403         {
404           data[i] = '\0';
405           val_start = i + 1;
406         }
407
408       if(data[i] == '&')
409         {
410           data[i] = '\0';
411           if(!process_param(&data[key_start], &data[val_start]))
412             {
413               size += snprintf(&buf[size], bufsize-size, "<h2>FAILED PROCESSING!</h2><br>Key: %s Value: %s<br>\n", 
414                               &data[key_start], &data[val_start]);
415               return -1;
416             }
417
418           printf("Key: %s\nValue: %s\n", 
419                  &data[key_start], &data[val_start]);
420           key_start = i + 1;
421         }
422     }  
423
424   if(!process_param(&data[key_start], &data[val_start]))
425     {
426       size += snprintf(&buf[size], bufsize-size, "<b>FAILED PROCESSING!</b><br>Key: %s Value: %s<br>\n", 
427                       &data[key_start], &data[val_start]);
428       return -1;
429     }
430
431   printf("Key: %s\nValue: %s\n", 
432          &data[key_start], &data[val_start]);
433
434   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");
435   size += snprintf(&buf[size], bufsize-size, "\n</body>\n</html>\n");
436
437   return size;
438 }
439 #endif