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