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