f80dbe27661e48b344c7c39340dc2d5da42b7f50
[rahunas] / src / rh-xmlrpc-server.c
1 /**
2  * RahuNAS XML-RPC Server implementation
3  * Author: Neutron Soutmun <neo.neutron@gmail.com>
4  *         Suriya Soutmun <darksolar@gmail.com>
5  * Date:   2008-08-07
6  */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "rahunasd.h"
11 #include "rh-xmlrpc-server.h"
12 #include "rh-radius.h"
13 #include "rh-ipset.h"
14 #include "rh-utils.h"
15 #include "rh-task.h"
16 #include "rh-task-memset.h"
17
18 extern const char* termstring;
19
20 int do_startsession(GNetXmlRpcServer *server,
21                     const gchar *command,
22                     const gchar *param,
23                     gpointer user_data,
24                     gchar **reply_string) 
25 {
26   struct main_server *ms = (struct main_server *)user_data; 
27   struct vserver *vs = NULL;
28   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0};
29   struct task_req req;
30   gchar *ip = NULL;
31   gchar *username = NULL;
32   gchar *session_id = NULL;
33   gchar *mac_address = NULL;
34   gchar *session_timeout = NULL;
35   gchar *bandwidth_max_down = NULL;
36   gchar *bandwidth_max_up = NULL;
37   gchar *serviceclass_name = NULL;
38   gchar *vserver_id = NULL;
39   uint32_t id;
40   GList *member_node = NULL;
41   struct rahunas_member *member = NULL;
42
43   if (param == NULL)
44     goto out;
45
46   DP("RPC Receive: %s", param);
47
48   ip          = rh_string_get_sep(param, "|", 1);
49   username    = rh_string_get_sep(param, "|", 2);
50   session_id  = rh_string_get_sep(param, "|", 3);
51   mac_address = rh_string_get_sep(param, "|", 4);
52   session_timeout    = rh_string_get_sep(param, "|", 5);
53   bandwidth_max_down = rh_string_get_sep(param, "|", 6);
54   bandwidth_max_up   = rh_string_get_sep(param, "|", 7);
55   serviceclass_name  = rh_string_get_sep(param, "|", 8);
56   vserver_id         = rh_string_get_sep(param, "|", 9);
57
58   if (ip == NULL || username == NULL || session_id == NULL 
59       || vserver_id == NULL)
60     goto out;
61
62   vs = vserver_get_by_id(ms, atoi(vserver_id));
63
64   if (vs == NULL)
65     goto out;
66
67   if (mac_address == NULL)
68     mac_address = g_strdup(DEFAULT_MAC);
69
70   id = iptoid(vs->v_map, ip);
71
72   if (id < 0) {
73     *reply_string = g_strdup("Invalid IP Address");
74     goto cleanup;
75   }
76
77   /* Check if client already registered */
78   member_node = member_get_node_by_id(vs, id);
79   if (member_node != NULL)
80     goto greeting;
81
82   req.id = id;
83   req.vserver_id = atoi(vserver_id);
84   req.username = username;
85   req.session_id = session_id;
86   parse_mac(mac_address, &ethernet);
87   memcpy(req.mac_address, &ethernet, ETH_ALEN);
88   req.session_start = 0;
89   req.session_timeout = 0;
90
91   if (session_timeout != NULL) {
92     if (atol(session_timeout) != 0)
93       req.session_timeout = time(NULL) + atol(session_timeout);
94   }
95
96   if (bandwidth_max_down != NULL)
97     req.bandwidth_max_down = atol(bandwidth_max_down);
98   else
99     req.bandwidth_max_down = 0;
100
101   if (bandwidth_max_up != NULL)
102     req.bandwidth_max_up = atol(bandwidth_max_up);
103   else
104     req.bandwidth_max_up = 0;
105
106   req.serviceclass_name    = serviceclass_name;
107   req.serviceclass_slot_id = 0;
108
109   rh_task_startsess(vs, &req);
110   member_node = member_get_node_by_id(vs, id);
111
112 greeting:
113   if (member_node != NULL) {
114     member = (struct rahunas_member *)member_node->data;
115     *reply_string = g_strdup_printf("Greeting! Got: IP %s, User %s, ID %s, "
116                                     "Service Class %s, Mapping %s",
117                                     ip, member->username, 
118                                     member->session_id,
119                                     member->serviceclass_name,
120                                     member->mapping_ip);
121     goto cleanup;
122   }
123
124 out:
125   *reply_string = g_strdup("Invalid input parameters");
126   goto cleanup;
127
128 cleanup:
129   DP("RPC Reply: %s", *reply_string);
130   g_free(ip);
131   g_free(username);
132   g_free(session_id);
133   g_free(mac_address);
134   g_free(session_timeout);
135   g_free(bandwidth_max_down);
136   g_free(bandwidth_max_up);
137   g_free(serviceclass_name);
138   g_free(vserver_id);
139   return 0;
140 }
141
142 int do_stopsession(GNetXmlRpcServer *server,
143                    const gchar *command,
144                    const gchar *param,
145                    gpointer user_data,
146                    gchar **reply_string)
147 {
148   struct main_server *ms = (struct main_server *)user_data;
149   struct vserver *vs = NULL;
150   struct task_req req;
151   gchar *ip = NULL;
152   gchar *mac_address = NULL;
153   gchar *cause = NULL;
154   gchar *vserver_id = NULL;
155   int cause_id = 0;
156   uint32_t   id;
157   int res = 0;
158   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0};
159   GList *member_node = NULL;
160   struct rahunas_member *member = NULL;
161
162   if (param == NULL)
163     goto out;
164
165   DP("RPC Receive: %s", param);
166
167   ip          = rh_string_get_sep(param, "|", 1);
168   mac_address = rh_string_get_sep(param, "|", 2);
169   cause       = rh_string_get_sep(param, "|", 3);
170   vserver_id  = rh_string_get_sep(param, "|", 4);
171
172   if (ip == NULL || vserver_id == NULL)
173     goto out;
174   vs = vserver_get_by_id(ms, atoi(vserver_id));
175
176   if (vs == NULL)
177     goto out;
178
179   if (mac_address == NULL)
180     mac_address = g_strdup(DEFAULT_MAC);
181
182   id = iptoid(vs->v_map, ip);
183
184   if (id < 0) {
185     *reply_string = g_strdup("Invalid IP Address");
186     goto cleanup;
187   }
188
189   parse_mac(mac_address, &ethernet);
190   memcpy(req.mac_address, &ethernet, ETH_ALEN);
191
192   member_node = member_get_node_by_id(vs, id);
193
194   if (member_node != NULL) {
195     member = (struct rahunas_member *) member_node->data;
196     if (memcmp(&ethernet, &member->mac_address, 
197         ETH_ALEN) == 0) {
198       req.id = id;
199       
200       if (cause == NULL) {
201         req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
202       } else {
203         cause_id = atoi(cause);
204         if (cause_id >= RH_RADIUS_TERM_USER_REQUEST && 
205             cause_id <= RH_RADIUS_TERM_HOST_REQUEST) {
206           req.req_opt = cause_id;
207         } else {
208           req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
209         }
210       }
211
212       res = rh_task_stopsess(vs, &req);
213       if (res == 0) {
214         *reply_string = g_strdup_printf("Client IP %s was removed!", 
215                                           idtoip(vs->v_map, id));
216       } else {
217          *reply_string = g_strdup_printf("Client IP %s error remove!", 
218                                         idtoip(vs->v_map, id));
219       }
220       goto cleanup;
221     } 
222   }
223
224   *reply_string = g_strdup_printf("%s", ip);
225   goto cleanup;
226
227 out:
228   *reply_string = g_strdup("Invalid input parameters");
229   goto cleanup;
230
231 cleanup:
232   DP("RPC Reply: %s", *reply_string);
233   g_free(ip);
234   g_free(mac_address);
235   g_free(cause);
236   g_free(vserver_id);
237   return 0;
238 }
239
240 int do_getsessioninfo(GNetXmlRpcServer *server,
241                       const gchar *command,
242                       const gchar *param,
243                       gpointer user_data,
244                       gchar **reply_string)
245 {
246   struct main_server *ms = (struct main_server *)user_data;
247   struct vserver *vs = NULL;
248   gchar *ip = NULL;
249   gchar *vserver_id = NULL;
250   uint32_t   id;
251   GList *member_node = NULL;
252   struct rahunas_member *member = NULL;
253
254   if (param == NULL)
255     goto out;
256
257   DP("RPC Receive: %s", param);
258
259   ip          = rh_string_get_sep(param, "|", 1);
260   vserver_id  = rh_string_get_sep(param, "|", 2);
261
262   if (ip == NULL || vserver_id == NULL)
263     goto out;
264
265   vs = vserver_get_by_id(ms, atoi(vserver_id));
266
267   if (vs == NULL)
268     goto out;
269
270   id = iptoid(vs->v_map, ip);
271
272   if (id < 0) {
273     *reply_string = g_strdup("Invalid IP Address");
274     goto cleanup;
275   }
276
277   member_node = member_get_node_by_id(vs, id);
278
279   if (member_node != NULL) {
280     member = (struct rahunas_member *) member_node->data;
281     if (!member->username) {
282       *reply_string = g_strdup("Invalid Username");
283       goto cleanup;
284     }
285
286     if (!member->session_id) {
287       *reply_string = g_strdup("Invalid Session ID");
288       goto cleanup;
289     }
290     
291     *reply_string = g_strdup_printf("%s|%s|%s|%d|%s|%d|%s",
292                                     ip, 
293                                     member->username,
294                                     member->session_id,
295                                     member->session_start,
296                                     mac_tostring(member->mac_address),
297                                     member->session_timeout,
298                                     member->serviceclass_description);
299     goto cleanup;
300   }
301
302   *reply_string = g_strdup_printf("%s", ip);
303   goto cleanup;
304
305 out:
306   *reply_string = g_strdup("Invalid input parameters");
307    goto cleanup;
308
309 cleanup:
310   DP("RPC Reply: %s", *reply_string);
311   g_free(ip);
312   g_free(vserver_id);
313   return 0;
314 }