5a72f9e1026e460ccb0cec168b59747370dae773
[oonf.git] / src-plugins / httptelnet / httptelnet.c
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2013, the olsr.org team - see HISTORY file
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 #include "common/common_types.h"
43 #include "common/autobuf.h"
44
45 #include "config/cfg_schema.h"
46
47 #include "core/olsr_logging.h"
48 #include "core/olsr_plugins.h"
49 #include "core/olsr_subsystem.h"
50
51 #include "tools/olsr_cfg.h"
52 #include "tools/olsr_http.h"
53 #include "tools/olsr_telnet.h"
54
55 /* constants */
56 #define _CFG_SECTION "httptelnet"
57
58 /* prototypes */
59 static int _init(void);
60 static void _cleanup(void);
61
62 static enum olsr_http_result _cb_generate_site(
63     struct autobuf *out, struct olsr_http_session *);
64
65 static void _cb_config_changed(void);
66
67 /* html handler */
68 static struct olsr_http_handler _http_site_handler = {
69   .content_handler = _cb_generate_site,
70 };
71
72 /* configuration */
73 static struct cfg_schema_entry _httptelnet_entries[] = {
74   CFG_MAP_STRING(olsr_http_handler, site, "site", "/telnet", "Path for http2telnet bridge"),
75   CFG_MAP_ACL(olsr_http_handler, acl, "acl", "default_accept", "acl for http2telnet bridge"),
76   CFG_MAP_STRINGLIST(olsr_http_handler, auth, "auth", "", "TODO"),
77 };
78
79 static struct cfg_schema_section _httptelnet_section = {
80   .type = _CFG_SECTION,
81   .cb_delta_handler = _cb_config_changed,
82   .entries = _httptelnet_entries,
83   .entry_count = ARRAYSIZE(_httptelnet_entries),
84 };
85
86 /* plugin declaration */
87 struct oonf_subsystem oonf_httptelnet_subsystem = {
88   .name = OONF_PLUGIN_GET_NAME(),
89   .descr = "OLSRD http2telnet bridge plugin",
90   .author = "Henning Rogge",
91
92   .cfg_section = &_httptelnet_section,
93
94   .init = _init,
95   .cleanup = _cleanup,
96 };
97 DECLARE_OONF_PLUGIN(oonf_httptelnet_subsystem);
98
99 /**
100  * Constructor of plugin
101  * @return 0 if initialization was successful, -1 otherwise
102  */
103 static int
104 _init(void) {
105   netaddr_acl_add(&_http_site_handler.acl);
106   strarray_init(&_http_site_handler.auth);
107
108   return 0;
109 }
110
111 /**
112  * Destructor of plugin
113  */
114 static void
115 _cleanup(void) {
116   strarray_free(&_http_site_handler.auth);
117   netaddr_acl_remove(&_http_site_handler.acl);
118   free((char *)_http_site_handler.site);
119 }
120
121 /**
122  * Callback for generating a http site from the output of the
123  * triggered telnet command
124  * @param out pointer to output buffer
125  * @param session pointer to http session
126  * @return http result code
127  */
128 static enum olsr_http_result
129 _cb_generate_site(struct autobuf *out, struct olsr_http_session *session) {
130   const char *command, *param;
131
132   command = olsr_http_lookup_param(session, "c");
133   param = olsr_http_lookup_param(session, "p");
134
135   if (command == NULL) {
136     return HTTP_404_NOT_FOUND;
137   }
138
139   switch (olsr_telnet_execute(command, param, out, session->remote)) {
140     case TELNET_RESULT_ACTIVE:
141     case TELNET_RESULT_QUIT:
142       session->content_type = HTTP_CONTENTTYPE_TEXT;
143       return HTTP_200_OK;
144
145     case _TELNET_RESULT_UNKNOWN_COMMAND:
146       return HTTP_404_NOT_FOUND;
147
148     default:
149       return HTTP_400_BAD_REQ;
150   }
151 }
152
153 /**
154  * Update configuration of remotecontrol plugin
155  */
156 static void
157 _cb_config_changed(void) {
158   if (cfg_schema_tobin(&_http_site_handler, _httptelnet_section.post,
159       _httptelnet_entries, ARRAYSIZE(_httptelnet_entries))) {
160     OLSR_WARN(LOG_CONFIG, "Could not convert httptelnet config to bin");
161     return;
162   }
163
164   if (_httptelnet_section.pre) {
165     olsr_http_remove(&_http_site_handler);
166   }
167   if (_httptelnet_section.post) {
168     olsr_http_add(&_http_site_handler);
169   }
170 }